Sunday, April 22, 2012

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

No comments:

Post a Comment