≡ Menu

Bash While Loop Example

How do I use bash while loop to repeat certain task under Linux / UNIX operating system? How do I set infinite loops using while statement?

The bash while loop is a control flow statement that allows code or commands to be executed repeatedly based on a given condition. For example, run echo command 5 times or read text file line by line or evaluate the options passed on the command line for a script.

bash while loop syntax

The syntax is as follows:

while [ condition ]
do
   command1
   command2
   command3
done

command1 to command3 will be executed repeatedly till condition is true. The argument for a while loop can be any boolean expression. Infinite loops occur when the conditional never evaluates to false. For example following while loop will print welcome 5 times on screen:

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

Here is a sample shell code to calculate factorial using while loop:

#!/bin/bash
counter=$1
factorial=1
while [ $counter -gt 0 ]
do
   factorial=$(( $factorial * $counter ))
   counter=$(( $counter - 1 ))
done
echo $factorial

To run just type:
$ chmod +x script.sh
$ ./script.sh 5

Output:

120

While loops are frequently used for reading data line by line from file:

#!/bin/bash
FILE=$1
# read $FILE using the file descriptors
exec 3<&0
exec 0<$FILE
while read line
do
	# use $line variable to process line
	echo $line
done
exec 0<&3

You can easily evaluate the options passed on the command line for a script using while loop:

......
..
while getopts ae:f:hd:s:qx: option
do
        case "${option}"
        in
                a) ALARM="TRUE";;
                e) ADMIN=${OPTARG};;
                d) DOMAIN=${OPTARG};;
                f) SERVERFILE=$OPTARG;;
                s) WHOIS_SERVER=$OPTARG;;
                q) QUIET="TRUE";;
                x) WARNDAYS=$OPTARG;;
                \?) usage
                    exit 1;;
        esac
done
.......
..

How do I use while as infinite loops?

Infinite for while can be created with empty expressions, such as:

#!/bin/bash
while :
do
	echo "infinite loops [ hit CTRL+C to stop]"
done

Conditional while loop exit with break statement

You can do early exit with the break statement inside the whil loop. You can exit from within a WHILE using break. General break statement inside the while loop is as follows:

while [ condition ]
do
   statements1      #Executed as long as condition is true and/or, up to a disaster-condition if any.
   statements2
  if (disaster-condition)
  then
	break       	   #Abandon the while lopp.
  fi
  statements3          #While good and, no disaster-condition.
done

In this example, the break statement will skip the while loop when user enters -1, otherwise it will keep adding two numbers:

#!/bin/bash
 
while :
do
	read -p "Enter two numnbers ( - 1 to quit ) : " a b
	if [ $a -eq -1 ]
	then
		break
	fi
	ans=$(( a + b ))
	echo $ans
done

Early continuation with the continue statement

To resume the next iteration of the enclosing WHILE loop use the continue statement as follows:

while [ condition ]
do
  statements1      #Executed as long as condition is true and/or, up to a disaster-condition if any.
  statements2
  if (condition)
  then
	continue   #Go to next iteration of I in the loop and skip statements3
  fi
  statements3
done

Recommended readings:

  • See all sample while loop shell script in our bash shell directory.
  • Bash loops from our Linux shell scripting tutorial guide
  • man bash
  • help while
  • help {
  • help break
  • help continue
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 26 comments… add one }
  • Leslie Satenstein March 16, 2008, 1:02 am

    Nice to see the Bash shell,
    How do you break out of a loop

    is there a break statement, or do you have to use a goto?

  • nixCraft March 18, 2008, 10:22 am

    Yes there is a break and continue statement. man bash has more information.

  • Cobra October 28, 2009, 7:38 am

    Very useful examples, thank you!

    • pritam singh August 6, 2010, 8:07 am

      Thank you so much .
      you define very nicly all exampls regarding while loop secquence
      statement….

  • pranathy November 4, 2009, 5:58 am

    could u please give the shell script for printing the fibonocci series and to know if the number is palindrome and also if it an armstrong number

  • Nikki July 20, 2010, 4:32 pm

    Does anyone know how to write a script that echoes three different arguments three times using a loop

    • san October 4, 2010, 12:32 pm

      shift command
      to traverse through arguments
      x=1
      while [ $x -le 3 ]
      do
      echo “argument is :$1”
      shift
      x=`expr $x + 1`
      done

  • Elaine November 24, 2010, 11:19 am

    does anyone can give an example of a while loop within a loop?

    • nixCraft November 24, 2010, 12:00 pm
      #!/bin/bash
      i=1
      y=1
      while [ $i -le 5 ]
      do 
      	while [ $y -le 10 ]
      	do   
      		echo "$y * $i = $(( $y * $i ))" 
      		(( y++ )) 
      	done
      	y=1
      	(( i++ ))
      done
  • Georg January 15, 2011, 1:38 pm

    The script “test” should set variable “filter_mode” to FALSE if there are no lines in the file “switches” and to TRUE if there exists at least one line in the file “switches”.
    Why do I get “filter_mode : FALSE” eventually?

    gg@GeorgSimon:~$ cat test
    #!/bin/bash

    filter_mode=FALSE
    cat ./switches | while read switch ; do
    echo switch : $switch
    filter_mode=TRUE
    echo filter_mode : $filter_mode
    break
    done
    echo filter_mode : $filter_mode
    gg@GeorgSimon:~$ cat switches
    switch
    gg@GeorgSimon:~$ sh test
    switch : switch
    filter_mode : TRUE
    filter_mode : FALSE

  • vaishali August 24, 2011, 4:59 am

    how to write a program in bash for displaying table using until statement? table should be like
    1 2 3 4
    2 4 6 8
    3 6 9 12
    4 8 12 16
    plz reply soon….thanks

    • Sanchit Bhatnagar September 7, 2011, 5:00 am

      #!/bin/bash
      #Print multiplication tables from I till X
      i=1
      x=10
      while [ $i -le $x ]
      do
      t=1
      str=””
      while [ $t -le 10 ]
      do
      str=$str” “$(( t*i ))
      $((t++))
      done
      echo $str
      $((i++))
      done

    • nur September 3, 2013, 6:01 pm

      #!/bin/bash

      for (( i=1; i<=4; i++))
      do
      for (( j=0; j<=3; j++ ))
      do
      a=$(( $i + $j ))
      echo -n " $a "
      done
      echo

      done

    • nur September 3, 2013, 7:30 pm

      #!/bin/bash

      for (( i=1; i<=4; i++))
      do
      flag=0
      for (( j=0; j<=3; j++ ))
      do

      if [ $flag -eq 0 ];then
      b=$i
      echo -n " $i "
      flag=1
      else
      b=$(( $b + $i ))

      echo -n " $b "
      fi
      done
      echo ""
      done

  • Sanchit Bhatnagar September 7, 2011, 5:00 am

    #!/bin/bash
    #Print multiplication tables from I till X
    i=1
    x=10
    while [ $i -le $x ]
    do
    t=1
    str=””
    while [ $t -le 10 ]
    do
    str=$str” “$(( t*i ))
    $((t++))
    done
    echo $str
    $((i++))
    done

  • mentor February 22, 2012, 2:15 pm

    x=1;while [ $x -le 10 ]; do let y=x*2; let z=x*3; let a=x*4; echo $x $y $z $a ; sleep 1; let x=x+1;done

  • nur September 3, 2013, 6:01 pm

    #!/bin/bash

    for (( i=1; i<=4; i++))
    do
    for (( j=0; j<=3; j++ ))
    do
    a=$(( $i + $j ))
    echo -n " $a "
    done
    echo

    done

  • din September 27, 2013, 3:21 am

    Hi, anybody can help me with my code below? I got error:

    ./while_do: line 4: [1: command not found

    thanks..
    ——————————————————-
    #!/bin/bash
    x=1
    while [$x -le 5];
    do
    echo “bil $x”
    ((x++))
    done

    • Robin September 27, 2013, 3:08 pm

      You made a little mistake with the “while” loop.
      You have to put a space between bracket and statement. Also, semicolon isn’t necessary here.

      So here is the correct “while” statement : while [ $x -le 5 ]

      • din October 1, 2013, 7:59 am

        Thanks Robin. Sorry for my late reply.

  • Shaifali Mittal March 4, 2014, 6:49 am

    I want to print this message block line by line and it will count opening braces n closing braces also…i.e if i use 3 opening braces then it should print 3 closing braces…

    djghdkjghjghfghhgklfjhgjkdfhgjkfhg
    jdhfgjlsdkhgklsdgjklsdjgkldjg
    djkfhdjklldgklsjh
       message {
          abc_djh = 300
          path_jksdfh {
             path_state = normal
             gamil.com
          }
          system data = { 8, 999}
          squre = { 10, 0x00 00xxxxxx }
       }
    }
    dghfdkwgfjkdgfjkd
    dgfsdghfjkdhf
    3657865894275
  • jagadeesh July 13, 2014, 12:23 pm

    I need a Script that wait for 1 hr checking for file ,If file is there it displays elase after 1 hr it has to display .. File not found

  • Marshall August 13, 2014, 6:30 am

    Thank you! Very easy to understand exemples and effective :)

    Thanks again

  • Jason September 22, 2014, 6:28 pm

    Thanks man. Very easy to follow and set up. Kudos.

  • NaturalCyborg March 25, 2016, 1:38 pm

    sometimes the condition is inside [ ] sometimes it is not, why?

    why the double parenthesis? ans=$(( a + b ))

    Thanks

  • gbviswanadh July 4, 2016, 7:15 am

    codes like a ab ac ad

    all files like oneab1606.txt setab.txt
    these type 100 files are there one??1606.txt
    and set??.txt

    i want ro write zip fill both of them

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , , , , , , , , , , , ,