≡ 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
Tweet itFacebook itGoogle+ itPDF itFound an error/typo on this page?

{ 24 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.

Leave a Comment