循环语句可以在循环内使用任意类型的命令,包括其他循环命令,这称为嵌套循环。注意,在使用嵌套循环时是在迭代中再进行迭代,命令运行的次数是乘积关系。不注意这点有可能会在脚本中造成问题。
来看一个嵌套for循环的简单例子:
$ cat test14
#!/bin/bash
# nesting for loops
for (( a = 1; a <= 3; a++ ))
do
echo "Starting loop $a:"
for (( b = 1; b <= 3; b++ ))
do
echo " Inside loop: $b"
done
done
$ ./test14
Starting loop 1:
Inside loop: 1
Inside loop: 2
Inside loop: 3
Starting loop 2:
...
这个被嵌套的循环(也称为内层循环)会在外部循环的每次迭代中遍历一遍它所有的值。注意,两个循环的do命令和done命令没有任何差别。bash shell知道执行第一个done命令时,指的是内层循环而非外层循环。
在混用循环命令时也一样,比如在while循环内部放置for循环:
$ cat test15
#!/bin/bash
# placing a for loop inside a while loop
var1=5
while [ $var1 -ge 0 ]
do
echo "Outer loop: $var1"
for (( var2 = 1; var2 < 3; var2++ ))
do
var3=$[ $var1 * $var2 ]
echo " Inner loop: $var1 * $var2 = $var3"
done
var1=$[ $var1 - 1 ]
done
$ ./test15
Outer loop: 5
Inner loop: 5 * 1 = 5
Inner loop: 5 * 2 = 10
Outer loop: 4
...
同样,shell能够区分开内层for循环和外层while循环各自的do命令和done命令。
如果真的想锻炼一下大脑,甚至可以混用until循环和while循环:
$ cat test16
#!/bin/bash
# using until and while loops
var1=3
until [ $var1 -eq 0 ]
do
echo "Outer loop: $var1"
var2=1
while [ $var2 -lt 5 ]
do
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo " Inner loop: $var1 / $var2 = $var3"
var2=$[ $var2 + 1 ]
done
var1=$[ $var1 - 1 ]
done
$ ./test16
Outer loop: 3
Inner loop: 3 / 1 = 3.0000
Inner loop: 3 / 2 = 1.5000
Inner loop: 3 / 3 = 1.0000
Inner loop: 3 / 4 = .7500
Outer loop: 2
...
外层的until循环以值3开始并会持续执行,直到值等于0。内层的while循环以值1开始并会持续执行,只要值小于5。每个循环都必须修改在测试条件中用到的值,否则循环就会无止境进行下去。