while命令在某种程度上糅合了if-then语句和for循环。while命令允许定义一个要测试的命令,只要该命令返回的退出状态码为0,就循环执行一组命令。它会在每次迭代开始时测试test命令,如果test命令返回非0退出状态码,while命令就会停止执行循环。
while的基本格式
while命令的格式如下:
while test command
do
other commands
done
while命令中定义的test command与if-then语句中的格式一模一样。你可以使用任何bash shell命令,或者用test command进行条件测试,比如测试变量值。
while命令的关键在于所指定的test command的退出状态码必须随着循环中执行的命令为改变。如果退出状态码不发生变化,那while循环就成了死循环。
test command最常见的用法是使用方括号来检查循环命令中用到的shell变量值:
$ cat test10 #!/bin/bash # while command test var1=10 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done $ ./test10 10 9 ...
while命令定义了每次迭代时检查的测试条件:
while [ $var1 -gt 0 ]
只要测试条件成立,while命令就会不停地循环执行定义好的命令。必须在这些命令中修改测试条件中用到的变量,否则就会陷入死循环。本例会使用shell算术将变量值减1:
var1=$[ $var1 - 1 ]
while循环会在测试条件不再成立时停止。
使用多个测试命令
while命令允许在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用于决定是否结束循环。如果你不小心,这可能会导致一些有意思的结果。下面的例子会说明这一点:
$ cat test11 #!/bin/bash # testing a multicommand while loop var1=10 while echo $var1 [ $var1 -ge 0 ] do echo "This is inside the loop" var1=$[ $var1 - 1] done $ ./test11 10 This is inside the loop 9 This is inside the loop ...
请仔细观察这个例子都做了些什么。它在while语句中定义了两个测试命令:
while echo $var1
[ $var1 -ge 0 ]
第一个测试简单地显示了var1变量的当前值。第二个测试用方括号来判断var1变量的值。在循环内部,echo语句会显示一条简单的消息,说明循环被执行了。注意在运行本例时,输出是如何结束的。
This is inside the loop
-1
while循环会在var1变量等于0时执行echo语句,然后将var1变量的值减1。接下来再次执行测试命令,判断是否进行下一次迭代。首先执行echo测试命令,显示var变量的值(小于0)。接着执行test命令,因为条件不成立,所以while循环停止。
这说明在含有多个命令的while语句中,在每次迭代时所有的测试命令都会被执行,包括最后一个测试命令失败的末代迭代。要小心这一点。另一处要留意的是该如何指定多个测试命令。注意要把每个测试命令都单独放在一行中。