for,while,until
1、for命令
for var in list
do
commands
done
在參數list中提供一系列用於迭代的值。
(1)讀取列表中的值
var取本次迴圈中的list中的值。而且出了迴圈後,變數var還保留最後一次迴圈的值,可以繼續使用。
(2)讀取列表中的複雜值
問題1:
當列表值當中有單引號,就會試圖用它們來定義一個單獨的資料值
有兩種方法解決這個問題:
使用逸出字元(反斜線符號)來轉義單引號
使用雙引號來定義使用單引號的值
問題2:
運行多字值
即如果有包含空格的資料值,就必須使用雙引號將它們包圍起來。
(3)從變數讀取列表
可以使用變數包含用於迭代的標準的文本值列表,並且還可以使用指派陳述式向包含在變數中的已存在列表添加一條項目
(4)讀取命令中的值
可以使用反引號字元來執行產生輸出的任何命令,然後在for命令中使用命令的輸出。
(5)改變欄位分隔符號
環境變數IFS定義了bash shell用作欄位分隔符號的字元列表,預設情況下,bash shell將空格、定位字元、分行符號看作欄位分隔符號。
所以,當處理需要包含空格的資料時,就會被處理成多個資料欄位,要解決該問題,就可以在shell指令碼中暫時更改環境變數IFS的值,限制bash shell看作是欄位分隔符號的字元。
例如,將IFS的值改為只識別分行符號:IFS=$’\n’,這樣就可以在每一個資料欄位中包含空格和定位字元了。
想指定多個IFS字元,只需要將它們在賦值行中串聯起來即可。
ex: 使用分行符號,冒號,分號和雙引號字元作為欄位分隔符號:IFS=$’\n’:;”
(6)使用萬用字元讀取目錄
1)可以使用for命令自動迭代檔案的目錄,就是迫使shell使用檔案通配,即產生與指定萬用字元匹配的檔案或路徑名的過程。
當不知道目錄中的所有檔案名稱時,使用該功能
2)通過在for命令中列出一系列目錄萬用字元,可以在同一個for語句中將目錄搜尋方法和列表方法結合起來。
for語句首先使用檔案萬用字元產生的檔案清單,然後迭代列表中的下一個檔案,可以結合列表中任意數目的萬用字元進行迭代。
注意:一般在試圖處理某檔案或目錄前,檢測一下是否存在是個好習慣
2、C式的for命令(1)C語言中的for命令
基本格式:for(( variable assignment ; condition ; iteration process ))
注意,有幾項不遵循標準bash shell的for方法:
1)變數的賦值可以包含空格
2)條件中的變數不以貨幣符號做首碼
3)迭代處理式不使用expr命令格式
(2)使用多個變數
C式的for命令也允許使用多個變數迭代,但只可以在for迴圈中定義一個條件。
3、while命令
(1)基本格式
while the command
do
other commands
done
最常見的是使用test命令括弧來檢驗用於迴圈命令的shell變數的值
(2)使用多條測試命令
bash shell中允許在while語句行定義多條test命令。但是實際上卻只有最後一條測試命令的退出狀態是用來決定迴圈是何時停止的。
在多命令的while語句中,所有的測試命令在每次迭代中都執行,包含測試命令失敗的最後一次迭代。
4、until命令
(1)until命令剛好與while命令相反,需要制定一條測試命令,通常產生一個非0的退出狀態。只要測試命令的退出狀態非0,就繼續執行內部迴圈,一旦測試命令返回0,則迴圈停止。
(2)基本格式:
until the commands
do
other commands
done
(3)與while相同,也可以在until命令語句中使用多條測試命令。只有最後一條命令的退出狀態能夠決定bash shell是否執行其他定義的命令。
5、嵌套迴圈
一條迴圈語句可以在迴圈中使用任何類型的命令,包括其他迴圈命令。
需要注意的:因為是在一個迭代內部執行另一個迭代,所以它增加了正在啟動並執行命令的運行次數。
混合迴圈同樣使用。
6、檔案資料的迴圈
當需要迭代儲存在檔案內部的項,就需要結合使用嵌套迴圈,並更改環境變數IFS
通過改變IFS使得for命令將檔案中的一行作為單獨的一項進行處理。
而提取了一行後,又需要對這一行內的個別資料進行處理,則需要再次設定IFS,並進行內部嵌套迴圈。
這是處理文本中用分隔字元分隔資料的一種好辦法,也是匯入電子錶資料的一種常用方法
7、控制迴圈(1)break命令
可以使用break跳出任何類型的迴圈。有以下幾種使用方式
1)跳出單迴圈:當只有一層迴圈時,直接終止
2)跳出內迴圈:當有嵌套迴圈時,終止所在的最裡面的內部迴圈
3)跳出外迴圈:可能有時處於內迴圈,卻需要跳出外迴圈。可以使用break命令帶上參數值:
break n (n表示要跳出的迴圈層級,預設情況下是1,也就是從當前層向外計數)
(2)continue命令
1)停止本次迴圈,跳過continue之後的語句,馬上開始下一次迴圈。
注意:若是增加測試條件變數的語句在被跳過的代碼中,就會出錯。
2)continue命令也可以使用參數,指定要繼續的迴圈層級
continue n
(n表示要跳出的迴圈層級,預設情況下是1,也就是從當前層向外計數)
8、處理迴圈的輸出
可以在shell指令碼中使用管道或者重新導向迴圈輸出結果
通過在done命令末尾添加處理命令來做到這一點,
ex1: done > output.txt(重新導向輸出)
(在done之前產生的輸出就不再列印在終端中,而全部寫入output.txt)。
ex2: done | sort(管道輸出)
(在done之前產生的輸出順序將被排序後,再輸出)。