猛砸,读取从文件中的行线,与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