第十二章:更多的結構化命令
for
基本格式
for var in listdo commandsdone
可以通過下面幾種方式指定list列表
1.羅列
for var in A B C D
如果羅列中的字串中有特殊字元,比如單引號,可以
1)使用逸出字元
2)使用雙引號
2.從變數讀取列表
list="A B C D"list=$list" E"for var in $list
3.從命令中讀取值
for var in `cat $file`
注意:這種情況換行也是欄位分隔符號
for迴圈結束之後,$var儲存著列表中的最後一個值
更改欄位分隔符號
環境變數IFS:internal field separator,內部欄位分隔符號
預設情況下,空格、定位字元和分行符號為欄位分隔符號
修改:
IFS=$'\n'IFS=:IFS=$'\n:;"'
(上面的$是做什麼的)
如果只是想臨時修改
IFS.OLD=$IFS
IFS=$'\n'
IFS=$IFS.OLD
用萬用字元讀取目錄
可以用for命令遍曆目錄,但是必須在檔案名稱或者路徑名中使用萬用字元,它會強制shell使用檔案擴充匹配(file globbing)
檔案擴充匹配是產生匹配指定的萬用字元的檔案名稱或路徑的過程
for file in /home/su1216/test/* /home/su1216/abcdo if [-d "$file"] #檔案名稱如果有空格,那麼需要將其用引號包起來 then echo "$file is a directory" elif [-f "$file"] echo "$file is a file" else echo "$file is not exist" fidone
C語言風格的for命令
for ((a = 1; a < 10; a++))
注意:
1)給變數賦值可以有空格
2)條件中的變數不以貨幣符號開頭
3)迭代過程中的算式未用expr命令格式
使用多個變數
for (( a = 1, b = 10; a <= 10; a++ ,b-- ))do echo "$a - $b"done
while命令
while test commanddo other commandsdone
根據test命令的退出狀態代碼決定是否繼續迴圈
使用多個測試命令
只有最後一個測試命令的退出狀態代碼會被用來決定什麼時候退出迴圈
var1=10while echo $var1 [ $var1 -ge 0 ]do echo "This is inside the loop" var1=$[ $var1 - 1 ]done
注意:每個測試條件都在單獨的行上,每次迭代,所有測試條件都會被執行!
until命令
與while工作方式相反
基本格式
until test commandsdo other commandsdone
也可以有多條測試命令,同while
嵌套迴圈
var1=3until [ $var1 -eq 0 ]do echo "Outer loop: $var1" var2=1 while [ $var2 -lt 5 ] do var3='echo "scale=4; $var1 / $var2 | bc"' echo " Inner loop:$var1 / $var2 = $var3" var2=$[ $var2 + 1 ] done var1=$[ $var1 - 1 ]done
控制迴圈
break
continue
他們都可以指定跳出/繼續的迴圈層數
break n
continue n
n預設都為1
處理迴圈的輸出
可以在迴圈的done之後接管輸出,比如
for var in A B Cdo echo "$var"done > out.txt
當然也可以使用管道
for var in A B Cdo echo "$var"done | sort
轉貼請保留以下連結
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/