HowTo: Iterate Bash For Loop Variable Range Under Unix / Linux

How can I iterate bash for loop using a variable range of numbers in Unix or Linux or BSD or Apple OS X operating systems?

You can use the following syntax for setting up ranges:

#!/bin/bash
for i in {1..5}
do
   echo "$i"
done

However, the following will not work:

#!/bin/bash
START=1
END=5
for i in {$START..$END}
do
   echo "$i"
done

Recommended solution

To fix this problem use three-expression bash for loops syntax which share a common heritage with the C programming language. It is characterized by a three-parameter loop control expression; consisting of an initializer (EXP1), a loop-test or condition (EXP2), and a counting expression (EXP3):

#!/bin/bash
START=1
END=5
echo "Countdown"
 
for (( c=$START; c<=$END; c++ ))
do
	echo -n "$c "
	sleep 1
done
 
echo
echo "Boom!"

Sample outputs:

Countdown
1 2 3 4 5 
Boom!

while…do..done

Another option is to use the bash while statement which is used to execute a list of commands repeatedly:

#!/bin/bash
START=1
END=5
## save $START, just in case if we need it later ##
i=$START
while [[ $i -le $END ]]
do
    echo "$i"
    ((i = i + 1))
done

Fixing the original code with eval

With eval builtins the arguments are concatenated together into a single command, which is then read and executed:

#!/bin/bash
START=1
END=5
for i in $(eval echo "{$START..$END}")
do
	echo "$i"
done

A note about iterate through an array

The Bash shell support one-dimensional array variables and you can use the following syntax to iterate through an array:

#!/bin/bash
 
## define an array ##
arrayname=( Dell HP Oracle )
 
## get item count using ${arrayname[@]} ##
for m in "${arrayname[@]}"
do
  echo "${m}"
  # do something on $m #
done

Sample outputs:

Dell
HP
Oracle

Posted by: SXI ADMIN

The author is the creator of SXI LLC and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.