我从http://bash.cyberciti.biz/guide/While_loop获得此代码,用于从文件中逐行读取
file=/etc/resolv.conf
while IFS= read -r line
do
# echo line is stored in $line
echo $line
done < "$file"
我不理解的部分是IFS=
以及它对此功能的贡献。有人可以向我解释一下吗?感谢。
答案 0 :(得分:36)
在这种情况下,IFS
设置为空字符串,以防止read
从行中删除前导和尾随空格。
通常更改IFS
来控制如何将输入拆分为多个字段。但在这种情况下,因为read
只有一个变量名称,read
不会将输入分成多个字段而不管IFS
的值。但是,它将删除POSIX规范中规定的前导和尾随空格(假设IFS
的值包含空格或未设置)。
请参阅read和field splitting的POSIX规范,了解其工作原理的详细信息。
答案 1 :(得分:3)
在该页面的第三个示例中,将IFS
设置为null可防止单词拆分,从而使该代码无效。这是代码:
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
答案 2 :(得分:-3)
要使IFS
成为真正的行分隔符,请使用IFS=$'\012'
。
答案 3 :(得分:-5)
IFS是行分隔符(或实际上是“内部字段分隔符”)的变量。该代码将有效地清空读取命令的行分隔符并将其设置为默认值。有时IFS在代码中的其他位置被更改,因为用户想要其他“行”结尾,例如一次只读一个句子(IFS=.
)或类似。
我猜他们在这里包含IFS=
只是为了确保它有效或者每个人,无论IFS变量的先前值如何。代码仍然可以在没有IFS=