shell指令碼迴圈傳值_Shell 指令碼的迴圈控制(for/while/until)
技術標籤:shell指令碼迴圈傳值
熟悉其他高階語言的夥伴們肯定了解迴圈控制語法是程式設計中非常基礎的內容,今天就介紹Shell 中設計迴圈控制的語法,for/while/until 等內容。
for 命令
for 命令是最簡單的迴圈控制語句,它的格式為:
for var in listdo commandsdone
語法比較簡單,不做冗餘的介紹了,直接上例子:
圖1
輸出結果:The next brand is MacOSThe next brand is WindowsThe next brand is LinuxThe next brand is UnixThe next brand is DeepinThe last brand is DeepinThe modified brand is Deepin
從圖1 中;item 作為臨時變數在 ”MacOS WIndows Linux Unix Deepin"列表中迴圈賦值,然後迴圈執行do 至 done 之間的語句。這裡值得注意的是:item 作為 for 迴圈的區域性變數(或者是棧變數)在迴圈體外依然可以訪問,例如在done 退出迴圈體後,依然可以訪問 item 這個for迴圈體內的區域性變數,這個是和其他高階語言不太相同的。具有高階語言的夥伴們可能第一次會覺得有些奇怪,不過這是Shell 語言的特點,這和C++那些宣告式的高階語言是有區別的。在C++中所有變數使用前必須要宣告型別,而在Shell 中卻沒有這樣的規定。for 迴圈中的列表可以有多種形式,可以像圖1中那樣直接列舉,也可以定義成一個變數,也可以通過命令的返回作為 list 物件(例如可以通過cat file將file中的內容作為list返回)這裡就不一一舉例了。
修改欄位分隔符
上面的例子中,我們發現,list使用過空格來作為分隔符的。那麼是什麼決定用空格作為list分隔符的呢。其實這裡是通過環境變數 IFS (internal field separator) bash shell 的分隔符默為:
- 空格
- 製表符
- 換行符
預設的分隔符優惠會造成麻煩,尤其是需要處理的資料中包含空格時。例如
檔名為:my_file
如圖,第二行"New York"中包含了空格,所以for 迴圈式,“New York”會被認為兩個元素。此結果並不是我們想要的。這是我們可以修改 IFS 只為換行符,來規避這種情況。
IFS=$'':; #可以一次指定多個符號作為分隔符,只需要將符號串聯一起。此例子中換行符,冒號和分號都作為分隔符。
圖2
輸出結果:value is Chinavalue is New Yorkvalue is Londonvalue is Japan
圖2中,我們修改IFS前先將舊的IFS儲存下來,然後在適當的地方恢復,這對於指令碼中部分邏輯需要恢復預設的 IFS 時提供了方法。
while 命令
while 命令其實是 if-then 和 for 迴圈的結合體。格式如下:
while test commanddocommandsdone
當 "test command" 返回碼為 0 時,do 後的commands 會迴圈執行。此處應該注意的是:"test command" 需要在 do 的執行過程中發生變化,否則while迴圈將會無法停止。
until 命令
until 命令和 while 命令工作方式完全相反,until 是等到命令的返回碼不為0 時,才執行迴圈體中的命令,格式如下:
until test commandsdoother commandsdone
上例子:
圖3
圖3中 until 後判斷var1 是否為0, 不為零是, 表示式返回碼為非 0 ,此時執行do 迴圈體內的命令,當 var1 為0 時, 返回碼為0, 此時until 迴圈結束。
迴圈控制
break 命令:是退出當前迴圈的簡單命令。
圖4
輸出結果the number is 1the number is 2the number is 3The loop is completed
從圖4中可以看出,當 var==4 時,for 迴圈會滿足break 條件而退出。break 也適合while 和 until 的迴圈。break 的預設規則和其他語言,例如C/C++相同,只會退出當前的迴圈,如果出現迴圈巢狀,那麼只會退出break 所在的迴圈。
break 跳出外部迴圈
break 語句除了預設的跳出當前迴圈,還能控制跳出外部迴圈,這是C/C++語言沒有的特性。語法格式為:
break n #n為1則是跳出當前迴圈,n為2 則是跳出上一級迴圈
上例子:
圖5
輸出結果:
Outer loop: 1Inner loop:1Inner loop:2Inner loop:3Inner loop:4
從圖5中可以看出是一個巢狀迴圈,在內部迴圈中,當b大於4時,"break 2" 會跳出上一級迴圈,所以外部迴圈只執行一次就被內部迴圈的break 語句退出了。這種用法在其他語言中不太常見,而且也不是特別推薦的用法。因為推出外部迴圈處理不當,可能會產生異非想要的結果。
continue 命令
continue 的原理和C/C++相同,會提前終止迴圈,但是不會退出迴圈。對於沒有程式設計經驗的小夥伴,聽起來有點繞,可以理解為程式邏輯的短路行為。直接上程式碼:
圖6
輸出結果為:the number is 1the number is 2the number is 3the number is 4the number is 5the number is 10the number is 11the number is 12the number is 13the number is 14
如圖6, continue 命令會跳過 5
continue 短路外部迴圈
continue 也有 break 類似的控制外部迴圈的命令,語法格式為:
continue n #短路到外部n層巢狀迴圈
例子和 ‘break n’類似,這裡就不再贅述了。
迴圈語句在實際工作中是非常有用的,例如你想建立多個使用者,那麼就可以在所有使用者名稱儲存在檔案中,然後寫個shell指令碼去讀取檔案,然後通過迴圈操作依次去除使用者名稱,然後再通過 useradd 命令新增使用者。所有命令在 shell指令碼中執行,一氣呵成,非常便利。