一、while 命令
while命令某種意義上是if-then語句和for循環的混雜體。while命令允許定義一個要測試的命令,然后循環執行一組命令,只要定義的測試命令返回的是退出狀態碼0。它會在每次迭代的一開始測試test命令。在test命令返回非零退出狀態碼時,while命令會停止執行那組命令。
1.1、while 的基本格式
while命令的格式是:
1 while test command 2 do
3 other commands 4 done
while命令中定義的test command和if-then語句(參見第12章)中的格式一模一樣。可以使用任何普通的bash shell命令,或者用test命令進行條件測試,比如測試變量值。
while命令的關鍵在於所指定的test command的退出狀態碼必須隨着循環中運行的命令而改變。如果退出狀態碼不發生變化, while循環就將一直不停地進行下去。
最常見的test command的用法是用方括號來檢查循環命令中用到的shell變量的值。
1 $ cat test10 2 #!/bin/bash 3 # while command test 4 var1=10
5 while [ $var1 -gt 0 ] 6 do
7 echo $var1 8 var1=$[ $var1 - 1 ] 9 done
10 $ ./test10 11 10
12 9
13 8
14 7
15 6
16 5
17 4
18 3
19 2
20 1
21 $
while命令定義了每次迭代時檢查的測試條件:
1 while [ $var1 -gt 0 ]
只要測試條件成立,while命令就會不停地循環執行定義好的命令。在這些命令中,測試條件中用到的變量必須修改,否則就會陷入無限循環。在本例中,我們用shell算術來將變量值減一:
1 var1=$[ $var1 - 1 ]
while循環會在測試條件不再成立時停止。
1.2、使用多個測試命令
while命令允許你在while語句行定義多個測試命令。只有最后一個測試命令的退出狀態碼會被用來決定什么時候結束循環。如果你不夠小心,可能會導致一些有意思的結果。下面的例子將說明這一點。
1 $ cat test11 2 #!/bin/bash 3 # testing a multicommand while loop 4 var1=10
5 while echo $var1 6 [ $var1 -ge 0 ] 7 do
8 echo "This is inside the loop"
9 var1=$[ $var1 - 1 ] 10 done
11 $ ./test11 12 10
13 This is inside the loop 14 9
15 This is inside the loop 16 8
17 This is inside the loop 18 7
19 This is inside the loop 20 6
21 This is inside the loop 22 5
23 This is inside the loop 24 4
25 This is inside the loop 26 3
27 This is inside the loop 28 2
29 This is inside the loop 30 1
31 This is inside the loop 32 0
33 This is inside the loop 34 -1
35 $
請仔細觀察本例中做了什么。while語句中定義了兩個測試命令。
1 while echo $var1 2 [ $var1 -ge 0 ]
第一個測試簡單地顯示了var1變量的當前值。第二個測試用方括號來判斷var1變量的值。在循環內部,echo語句會顯示一條簡單的消息,說明循環被執行了。注意當你運行本例時輸出是如何結束的。
1 This is inside the loop 2 -1
3 $
while循環會在var1變量等於0時執行echo語句,然后將var1變量的值減一。接下來再次執行測試命令,用於下一次迭代。echo測試命令被執行並顯示了var變量的值(現在小於0了)。直到shell執行test測試命令,whle循環才會停止。
這說明在含有多個命令的while語句中,在每次迭代中所有的測試命令都會被執行,包括測試命令失敗的最后一次迭代。要留心這種用法。另一處要留意的是該如何指定多個測試命令。注意,每個測試命令都出現在單獨的一行上。