自學Linux Shell12.4-for命令

點擊返回 自學Linux命令行與Shell腳本之路html

12.4-for命令

1. for命令

格式一shell

1 for var in list
2 do 
3    commands
4  done

格式二安全

1 for var in list;do
  • 在list參數中,需提供迭代中使用的一系列值
  • 在每次迭代中,變量var會包含列表中的當前值,第一次迭代使用列表中第一個值,第二次迭代使用列表中第二個值,以此類推
  • 在do和done語句之間輸入的命令可使一條或者幾條命令,在這些命令中$var變量包含着此次迭代對應的當前列表的值

list參數中,需提供迭代中使用的一系列值,能夠經過多種方式制定List列表中的值。bash

1.1 讀取列表中的值 
for的基本用法就是遍歷for名利自身所定義的一系列值。
spa

在最後一次迭代後,$test變量的值會在shell腳本的剩餘部分保持有效。它會一直保持最後一次迭代的值(除非你修改了它)
1.2 讀取列表中複雜的值命令行

for循環List每一個值用空格分割,當列表中有單引號或者空格時,遍歷時會出現錯誤,有兩種解決辦法: 3d

  • 使用轉義字符(反斜線)來將單引號轉移; 
  • 使用雙引號來定義用到單引號的值。

1.3 從變量讀取列表中的值 
code

將一系列的值都集中存儲在一個變量中,而後須要遍歷變量中的整個列表。htm

1.4 從命令中讀取值 
blog

有兩種方式能夠將命令輸出賦值給變量: 

  • 反引號字符(`) 
  • $()格式 

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=$IFS.OLD

這就保證了在腳本的後續操做中使用的是IFS的默認值。 
1.5.3 遍歷一個文件中用冒號分隔的值:

1 IFS=:

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 > output.txt

相關文章
相關標籤/搜索