shell结构化命令——while命令

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语句中,在每次迭代时所有的测试命令都会被执行,包括最后一个测试命令失败的末代迭代。要小心这一点。另一处要留意的是该如何指定多个测试命令。注意要把每个测试命令都单独放在一行中。