我正在使用来自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=
以及它如何对此功能有所贡献。 有人能向我解释一下吗?谢谢。
我正在使用来自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=
以及它如何对此功能有所贡献。 有人能向我解释一下吗?谢谢。
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
要将IFS
设置为真正的行分隔符,请使用IFS=$'\012'
。
IFS=
部分,以及它的用途。顺便说一句,IFS=$'\n'
可能会更清晰(尽管有争议)。 - gniourf_gniourfIFS 是一种用于行分隔符(实际上是“内部字段分隔符”)的变量。该代码将有效地清空您的读取命令的行分隔符并将其设置为默认值。有时,由于用户希望使用其他“行”结束方式(例如逐句阅读IFS=.
),因此在代码的其他位置更改 IFS。
我想他们在这里包含了 IFS=
只是为了确保它适用于每个人,而不管 IFS 变量的先前值如何。即使没有 IFS=
,该代码仍应正常工作。
IFS=
也能正常工作。非常感谢。 - wakandanIFS=
和read -r line
放在同一行吗?这是允许的吗? - wakandanIFS
设置为空并不会将其设置为默认值(默认值为空格、制表符、换行符)。它不仅用于行结尾,还用于进行单词分割。要逐句阅读,可以使用read
命令的-d
定界符选项。 - Dennis WilliamsonIFS
设置为空字符串是为了防止read
从每行中删除前导和尾随空格。 - Richard Hansenread
函数,它是有效的。例如,如果您想更快地解析/etc/resolv.conf文件,可以使用while IFS=' ' read -r name address
来同时拆分字段。 - l0b0