for var in one two three four five
do
echo -----------
echo '$var is '$var
echo
done
上例的執(zhí)行結(jié)果將會(huì)是:
1) for 會(huì)定義一個(gè)叫 var 的變量,其值依次是 one two three four five 。
2) 因?yàn)橛?5 個(gè)變量值,因此 do 與 done 之間的命令行會(huì)被循環(huán)執(zhí)行 5 次。
3) 每次循環(huán)均用 echo 產(chǎn)生三行句子。
而第二行中不在 hard quote 之內(nèi)的 $var 會(huì)依次被替換為 one two three four five 。
4) 當(dāng)最后一個(gè)變量值處理完畢,循環(huán)結(jié)束。
我們不難看出,在 for loop 中,變量值的多寡,決定循環(huán)的次數(shù)。
然而,變量在循環(huán)中是否使用則不一定,得視設(shè)計(jì)需求而定。
倘若 for loop 沒有使用 in 這個(gè) keyword 來指定變量值清單的話,其值將從 $@ (或 $* )中繼承:
for var; do
....
done
(若你忘記了 positional parameter ,請(qǐng)溫習(xí)第 9 章...)
for loop 用于處理"清單"(list)項(xiàng)目非常方便,其清單除了可明確指定或從 positional parameter 取得之外,也可從變量替換或命令替換取得... (再一次提醒:別忘了命令行的"重組"特性﹗)
然而,對(duì)于一些"累計(jì)變化"的項(xiàng)目(如整數(shù)加減),for 亦能處理:
for ((i=1;i<=10;i++))
do
echo "num is $i"
done
除了for loop ,上面的例子我們也可改用 while loop 來做到:
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
while loop 的原理與 for loop 稍有不同:
它不是逐次處理清單中的變量值,而是取決于 while 后面的命令行之 return value :
* 若為 ture ,則執(zhí)行 do 與 done 之間的命令,然后重新判斷 while 后的 return value 。
* 若為 false ,則不再執(zhí)行 do 與 done 之間的命令而結(jié)束循環(huán)。
分析上例:
1) 在 while 之前,定義變量 num=1 。
2) 然后測(cè)試(test) $num 是否小于或等于 10 。
3) 結(jié)果為 true ,于是執(zhí)行 echo 并將 num 的值加一。
4) 再作第二輪測(cè)試,其時(shí) num 的值為 1+1=2 ,依然小于或等于 10,因此為 true ,繼續(xù)循環(huán)。
5) 直到 num 為 10+1=11 時(shí),測(cè)試才會(huì)失敗... 于是結(jié)束循環(huán)。
我們不難發(fā)現(xiàn):
* 若 while 的測(cè)試結(jié)果永遠(yuǎn)為 true 的話,那循環(huán)將一直永久執(zhí)行下去:
while :; do
echo looping...
done
上例的" : "是 bash 的 null command ,不做任何動(dòng)作,除了送回 true 的 return value 。
因此這個(gè)循環(huán)不會(huì)結(jié)束,稱作死循環(huán)。
死循環(huán)的產(chǎn)生有可能是故意設(shè)計(jì)的(如跑 daemon),也可能是設(shè)計(jì)錯(cuò)誤。
若要結(jié)束死尋環(huán),可透過 signal 來終止(如按下 ctrl-c )。
一旦你能夠理解 while loop 的話,那,就能理解 until loop :
* 與 while 相反,until 是在 return value 為 false 時(shí)進(jìn)入循環(huán),否則結(jié)束。
因此,前面的例子我們也可以輕松的用 until 來寫:
num=1
until [ ! "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
或是:
num=1
until [ "$num" -gt 10 ]; do
echo "num is $num"
num=$(($num + 1))
done
聯(lián)系客服