我在從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=
以及如何它有助於此功能。有人可以向我解釋這一點嗎?謝謝。
我在從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=
以及如何它有助於此功能。有人可以向我解釋這一點嗎?謝謝。
IFS是行分隔符(或實際上是「內部字段分隔符」)的變量。該代碼將有效地清空讀取命令的行分隔符並將其設置爲默認值。由於用戶想要其他「行」結尾,例如一次讀取一個句子(IFS=.
)或類似行爲,有時IFS會在代碼的其他位置發生更改。
我想他們在這裏包括了IFS=
只是爲了確保它的工作原理或每個人,不管之前的IFS變量的值。代碼應該仍然工作沒有IFS=
在該頁上的第三個示例中,將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"
書面,所有上線的話都存儲在field1
和field2
,等等,都是空的。行更改爲這一點,它會正常工作:
while read -r field1 field2 field3 ... fieldN
在這種情況下,IFS
設置爲空字符串,以防止read
從線剝離前後空白。
更改IFS
通常用於控制輸入如何拆分爲多個字段。但在這種情況下,因爲read
只有一個變量名,所以不管IFS
的值如何,read
都不會將輸入拆分爲多個字段。但是,它將刪除POSIX規範中規定的前導和尾隨空白(假定IFS
的值包含空格或未設置)。
有關工作原理的詳細信息,請參閱POSIX規範read和field splitting。
要使IFS
成爲真正的行分隔符,請使用IFS=$'\012'
。
檢查[unix.SE]上的[等價問題](http://unix.stackexchange.com/q/209123/22565)。 – 2015-11-09 17:30:27