For and While loop in Shell Scripts


Reading time: 30 minutes | Coding time: 10 minutes

In this article, we will understand how to use for and while loops in shell scripts which is widely used implementation technique.

We will cover the following topics:

  1. While Loops
  2. For Loops

Loops are used to implement same problem logic multiple times with slight variation.
Looping structures provided in Shell Scripts are while loop and for loop.

1. While loops

While loops are entry-controlled loops, i.e., they check the condition before entering the looping structure.

Syntax:

while [ (condition) ]
do 
    statement 1
    statement 2
    statement 3
    ...
done

Example:

#!/bin/bash
i=1
while [ $i -le 5 ]
do
	echo "$i";
	i=$(($i+1));
done

Shell Script code in vi editor

WhileBasics1

Here,

  • Condition: $i fetches the value of variable i and checks whether it is less than or equal to (specied by tag -le)
  • $(($i+1)): is used to increment the value of variable i

Output:

Whilebasics2

Infinite loop

Instead of specifying a condition, if : is specified, while goes on in an infinite loop.
To define exit in infinite loop in the code, break statement is used.
To exit the loop manually, one must click ctrl+c to kill the process or ctrl+z to stop the process.

Code:

#!/bin/bash
while :
do
	echo "infinite loop";
done

Shell code in vi-editor

W-Infinite

Output:

W-infinite2

2. For loops

For loops are entry-controlled looping structures that check the condition before entering the loop.

Syntax:

for iteration_variable in {set of space separated values}
do
    statement 1
    statement 2
    statement 3
    ...
done

Iteration variable accesses each element of set of values one by one and performs the task specified within the loop.

Example:

#!/bin/bash
for i in 1 2 3 4 5 6 7 8
do
	echo "This is loop $i";
done

Here, for loop access each numeric value and prints them in different lines.

Shell code on vi editor

tuple--1-

Output:

tuple--2--1

For loop on list of items

For loop does necessary work on conditions.
It may simply access a set of values (which may be of different type as in Strings, integers, float values) one by one and performs defined task.

Code:

for i in Hello World "Hello World" Bye 
do
	echo "$i"
done

Shell code on vi editor

items--1-

Here, for loop access each of the space separated string one by one and prints the iteration variable value in each loop.

Output:

items--2-

For loops with increment

For loop may be specified for a range of values which increment with +1 jump.
Thus, if range is specified as 1-5, for loop will work for values 1,2,3,4 and 5.

Syntax:

for iteration_variable in {start..end}
do
    statements...
done

Code:

#!/bin/bash
for i in {1..10}
do
	echo "This is $i increment"
done

Shell code on vi editor

increment--1-

Here, iteration variable takes values 1,2,3,4,...9,10.

Output:

increment--2-

For loop with jump statements

For loops over range may also have a defined jump value:

Syntax:

for iteration_variable in {start..end..jump}
do
    statements...
done

Example: If for loop ranges from 0-10 and has a jump value of 2 then it access even numbers 0,2,4,6 and 10.

Code:

#!/bin/bash
for i in {1..10..2}
do
	echo "This is $i";
done

Shell code on vi editor

for_jump--1-

Output:

for_jump--2-

For loop with seq keyword

Range of values without increment can also be defined using the seq keyword.
Note: Use of seq keyword is not advised as seq keyword was supported in Bash version 3.0 or below.

Syntax:

for iteration_variable in `seq start end`

Code:

#!/bin/bash
for i in `seq 1 10`
do 
	echo "This is $i increment"
done

Shell code on vi editor

seq--1-

Output:

seq--2-

For loop in C/CPP style

Syntax:

for (( initialize_variable; condition; Increment ))

Note: Spacing in shell scripts are very important. Improper spacing may lead to shell interpreter not recognizing the command.

Code:

#!/bin/bash
for (( i=0; i<10; i++ ))
do
	echo "$i";
done

Shell code on vi editor

ctype--1-

Output:

ctype--2-

Infinite loops using for

Specifying no condition in C type for loops lead to infinite looping.

Code:

#!/bin/bash
for (( ; ; ))
do
	echo "Infinite loop";
done

Shell code on vi editor

infinite--1-

Output:

infinite--2-

Using break statement

Break keyword is used to exit the looping structures using a condition.
Generally, break condition is used to exit an infinite loop.

Code:

#!/bin/bash
i=1; #initialize variable to 1
for (( ; ; )) #infinite loop
do
	echo "$i"
	i=$(($i+1))
	if [ $i -eq 10 ]
	then
		break;
	fi
done

Shell code on vi editor

forbreak--1-

Here,

  • We initialize a variable with value 1.
  • We increment the variable with +1 in infinite loop
  • We exit the loop with break condition after variable gets a value 10.

Output:

forbreak--2-

Using continue statement

Continue condition is used to ignore the current looping statements and move on to the next looping condition.

Code:

#!/bin/bash
for i in 1 2 3 4 5
do 
	if [ $i -eq 3 ]
	then
		continue;
	fi;
	echo "$i";
done

Shell code on vi editor

forcontinue--1-

Here, we ignore the looping statements having iteration value equal to 3.

Output:

forcontinue--2-

References and Further Reading

Shell Scripting tutorials