2010-12-08 41 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'