Bash,从文件中逐行读取,带有IFS

时间:2010-12-08 09:11:23

标签: bash line

我从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=以及它对此功能的贡献。有人可以向我解释一下吗?感谢。

4 个答案:

答案 0 :(得分:36)

在这种情况下,IFS设置为空字符串,以防止read从行中删除前导和尾随空格。

通常更改IFS来控制如何将输入拆分为多个字段。但在这种情况下,因为read只有一个变量名称,read不会将输入分成多个字段而不管IFS的值。但是,它将删除POSIX规范中规定的前导和尾随空格(假设IFS的值包含空格或未设置)。

请参阅readfield 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"

如上所述,该行上的所有字词都存储在field1field2等中,为空。将行更改为此行,它将正常工作:

while read -r field1 field2 field3 ... fieldN

答案 2 :(得分:-3)

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

答案 3 :(得分:-5)

IFS是行分隔符(或实际上是“内部字段分隔符”)的变量。该代码将有效地清空读取命令的行分隔符并将其设置为默认值。有时IFS在代码中的其他位置被更改,因为用户想要其他“行”结尾,例如一次只读一个句子(IFS=.)或类似。

我猜他们在这里包含IFS=只是为了确保它有效或者每个人,无论IFS变量的先前值如何。代码仍然可以在没有IFS=

的情况下运行