2010-12-08 35 views
10

我在從http://bash.cyberciti.biz/guide/While_loop這個代碼,用於從文件猛砸,讀取從文件中的行線,與IFS

file=/etc/resolv.conf 
while IFS= read -r line 
do 
     # echo line is stored in $line 
    echo $line 
done < "$file" 

部分逐行讀取我不明白的是IFS=以及如何它有助於此功能。有人可以向我解釋這一點嗎?謝謝。

+0

檢查[unix.SE]上的[等價問題](http://unix.stackexchange.com/q/209123/22565)。 – 2015-11-09 17:30:27

回答

-5

IFS是行分隔符(或實際上是「內部字段分隔符」)的變量。該代碼將有效地清空讀取命令的行分隔符並將其設置爲默認值。由於用戶想要其他「行」結尾,例如一次讀取一個句子(IFS=.)或類似行爲,有時IFS會在代碼的其他位置發生更改。

我想他們在這裏包括了IFS=只是爲了確保它的工作原理或每個人,不管之前的IFS變量的值。代碼應該仍然工作沒有IFS=

+0

這是真的,沒有`IFS =`它仍然工作正常。非常感謝。 – wakandan 2010-12-08 09:28:13

+0

只是一件很快的事情,我們可以把這樣一個賦值`IFS =`和`read -r line`放在同一行?允許嗎? – wakandan 2010-12-08 09:31:41

+1

user121870,是的,它是允許的。將變量放在命令前面時,變量只對該命令可見。這適用於所有的Bash命令,即使是你自己在終端上編寫的命令。試試這個命令:「MANWIDTH = 20 man bash」。 – 2010-12-08 09:35:07

3

在該頁上的第三個示例中,將IFS設置爲空可防止導致該代碼無法工作的分詞。下面是該代碼:

while IFS= read -r field1 field2 field3 ... fieldN 
do 
    command1 on $field1 
    command2 on $field1 and $field3 
    .. 
    .... 
    commandN on $field1 ... $fieldN 
done < "/path/to dir/file name with space" 

書面,所有上線的話都存儲在field1field2,等等,都是空的。行更改爲這一點,它會正常工作:

while read -r field1 field2 field3 ... fieldN 
30

在這種情況下,IFS設置爲空字符串,以防止read從線剝離前後空白。

更改IFS通常用於控制輸入如何拆分爲多個字段。但在這種情況下,因爲read只有一個變量名,所以不管IFS的值如何,read都不會將輸入拆分爲多個字段。但是,它將刪除POSIX規範中規定的前導和尾隨空白(假定IFS的值包含空格或未設置)。

有關工作原理的詳細信息,請參閱POSIX規範readfield splitting

-3

要使IFS成爲真正的行分隔符,請使用IFS=$'\012'