天天看點

自學Linux Shell12.4-for指令

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名利自身所定義的一系列值。

自學Linux Shell12.4-for指令

在最後一次疊代後,$test變量的值會在shell腳本的剩餘部分保持有效。它會一直保持最後一次疊代的值(除非你修改了它)

1.2 讀取清單中複雜的值

for循環List每個值用空格分割,當清單中有單引号或者空格時,周遊時會出現錯誤,有兩種解決辦法: 

  • 使用轉義字元(反斜線)來将單引号轉移; 
  • 使用雙引号來定義用到單引号的值。
自學Linux Shell12.4-for指令
自學Linux Shell12.4-for指令
自學Linux Shell12.4-for指令
自學Linux Shell12.4-for指令

1.3 從變量讀取清單中的值 

将一系列的值都集中存儲在一個變量中,然後需要周遊變量中的整個清單。

自學Linux Shell12.4-for指令

1.4 從指令中讀取值 

有兩種方式可以将指令輸出指派給變量: 

  • 反引号字元(`) 
  • $()格式 
自學Linux Shell12.4-for指令
自學Linux Shell12.4-for指令

1.5 更改字段分隔符

上面的例子存在一個問題,就是如果指令中數值是有空格的話,for依然将它每個單詞作為單獨的值。造成這個問題的原因是特殊的環境變量IFS,叫作内部字段分隔符。

預設情況下,bash shell會将下列字元當作字段分隔符: 

  • *空格
  • *制表符
  • *換行符

如果bash shell在資料中看到這些字元中的任意一個,它就會假定這表明了清單中一個新資料字段的開始。

1.5.1 想修改IFS的值,使其隻能識别換行符,那就必須:

1 IFS=$'\n'      

将這個語句加入到腳本中,告訴bash shell在資料值中忽略空格和制表符。

自學Linux Shell12.4-for指令

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指令格式
自學Linux Shell12.4-for指令

也可以使用多個變量,但卻隻能在for循環中定義一種條件。

自學Linux Shell12.4-for指令

使用類C風格for循環要注意以下事項: 

  • 如果循環條件最初的退出狀态為非0,則不會執行循環體 
  • 當執行更新語句時,如果循環條件的退出狀态永遠為0,則for循環将永遠執行下去,進而産生死循環 
  • Linux shell中不運作使用非整數類型的數作為循環變量 
  • 如果循環體中的循環條件被忽略,則預設的退出狀态為0 
  • 在類C風格的for循環中,可以将三個語句全部忽略掉,for((; ; )) 

3. 處理循環的輸出

将結果重定向到output.txt檔案,不輸出到螢幕

1 done