for語法格式
for var in list;do
commands
done
其中list可以包含:
1) 直接寫
for alpha in a b c d;do echo $alpha done
2)變量
list="a b c d" for alpha in $list;do echo $alpha done
在shell執行的時候會進行變量替換,上面的list變量替換之后,for循環的形式和1中的形式一模一樣。但是如果為$list加上了引號,即如果寫為下面的形式:
list="a b c d" for alpha in "$list";do echo $list done
shell變量替換之后為:
list="a b c d" for alpha in "a b c d";do echo $list done
這時輸出就只有一行a b c d。
3)shell命令
for alpha in `cat alpha.txt`;do echo $alpha done
假設alpha.txt文件里面的內容就是a b c d,那么通過使用``符先將文件內容讀出,再進行迭代,結果和1一樣
4)讀取文件目錄
for file in $HOME/a/*;do echo $file done
上面的代碼先進行通配符glob擴展,假設目錄a下有2個文件1.txt, 2.txt,一個文件夾b,那么經過擴展之后實際為:
for file in $HOME/a/1.txt $HOME/a/2.txt $HOME/a/b;do echo $file done
此時file的值依次為$HOME/a/1.txt,$HOME/a/2.txt, $HOME/a/b。
但是假設a不是一個目錄,是一個文件,此時通配符擴展會失敗,此時file的值直接就是$HOME/a/*。
這里還需要注意的一個地方是,這里進行的是shell glob的擴展,因此擴展的時候不能越過文件邊界,換句歡說,如果b目錄下面還有文件,這些文件是無法擴展出來的,即擴展無法越過文件夾b
IFS
for循環當中,list的被如何分割就是由IFS決定的,默認情形下,IFS的值是:
Tab
空格
換行
你可以重新給IFS賦值,:
IFS=: #此時分隔符為:
IFS=:; #此時分隔符為:和;
C風格的for循環
for (( i = 0; i < 10; i++ ));do
commands
done
這里的風格和C中一樣,其中的變量i可以是任何變量
while 循環
while command;do
commands
done
其中的command可以是shell command,也可以test condition。如果command的返回值為0或者測試成立,則執行,否則不執行。
這里需要注意的是,while可以使用多個條件,但是只有最后一個條件起作用:
var=100 while [ $var -lt 0 ];[ $var -gt 0 ];do echo $var done
在這段代碼中,雖然第一個條件一開始就不成立,但是起作用的是最后一個條件,因此,這是一個無線循環
until循環
until command;do
commnds
done
和while一樣,唯一不同的是如果command返回0,則不執行,否則就執行