12.4-for指令
1. for指令
格式一
1 for var in list
2 do
3 commands
4 done
格式二
1 for var in list;do
- 在list參數中,需提供疊代中使用的一系列值
- 在每次疊代中,變量var會包含清單中的目前值,第一次疊代使用清單中第一個值,第二次疊代使用清單中第二個值,以此類推
- 在do和done語句之間輸入的指令可以使一條或者幾條指令,在這些指令中$var變量包含着這次疊代對應的目前清單的值
list參數中,需提供疊代中使用的一系列值,可以通過多種方式制定List清單中的值。
1.1 讀取清單中的值 for的基本用法就是周遊for名利自身所定義的一系列值。
在最後一次疊代後,$test變量的值會在shell腳本的剩餘部分保持有效。它會一直保持最後一次疊代的值(除非你修改了它)
1.2 讀取清單中複雜的值
for循環List每個值用空格分割,當清單中有單引号或者空格時,周遊時會出現錯誤,有兩種解決辦法:
- 使用轉義字元(反斜線)來将單引号轉移;
- 使用雙引号來定義用到單引号的值。
1.3 從變量讀取清單中的值
将一系列的值都集中存儲在一個變量中,然後需要周遊變量中的整個清單。
1.4 從指令中讀取值
有兩種方式可以将指令輸出指派給變量:
- 反引号字元(`)
- $()格式
1.5 更改字段分隔符
上面的例子存在一個問題,就是如果指令中數值是有空格的話,for依然将它每個單詞作為單獨的值。造成這個問題的原因是特殊的環境變量IFS,叫作内部字段分隔符。
預設情況下,bash shell會将下列字元當作字段分隔符:
- *空格
- *制表符
- *換行符
如果bash shell在資料中看到這些字元中的任意一個,它就會假定這表明了清單中一個新資料字段的開始。
1.5.1 想修改IFS的值,使其隻能識别換行符,那就必須:
1 IFS=$'\n'
将這個語句加入到腳本中,告訴bash shell在資料值中忽略空格和制表符。
1.5.2 一個可參考的安全實踐是在改變IFS之前儲存原來的IFS值,之後再恢複它。
1 IFS.OLD=$IFS
2 IFS=$'\n'
3 <在代碼中使用新的IFS值>
4
這就保證了在腳本的後續操作中使用的是IFS的預設值。
1.5.3 周遊一個檔案中用冒号分隔的值:
1
1.5.4 如果要指定多個IFS字元,隻要将它們在指派行串起來就行。
1 IFS=$'\n':;"
這個指派會将換行符、冒号、分号和雙引号作為字段分隔符。如何使用IFS字元解析資料沒有任何限制。
1.6 用通配符讀取目錄
for指令自動周遊目錄中檔案,進行此操作必須在檔案名或路徑名中使用通配符。
1 for file in /proc/*;
2 do
3 echo $file is file path \! ;
4 done
2. for指令(C語言風格)
1 for((expr1; expr2; expr3))
2 do
3 command
4 command
5 ...
6 done
有些部分并沒有遵循bash shell标準的for指令:
- 變量指派可以有空格
- 條件中的變量不以美元符開頭
- 疊代過程的算式為用expr指令格式
也可以使用多個變量,但卻隻能在for循環中定義一種條件。
使用類C風格for循環要注意以下事項:
- 如果循環條件最初的退出狀态為非0,則不會執行循環體
- 當執行更新語句時,如果循環條件的退出狀态永遠為0,則for循環将永遠執行下去,進而産生死循環
- Linux shell中不運作使用非整數類型的數作為循環變量
- 如果循環體中的循環條件被忽略,則預設的退出狀态為0
- 在類C風格的for循環中,可以将三個語句全部忽略掉,for((; ; ))
3. 處理循環的輸出
将結果重定向到output.txt檔案,不輸出到螢幕
1 done