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

wak*_*dan 10 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"
Run Code Online (Sandbox Code Playgroud)

我不理解的部分是IFS=它对这个功能的贡献.有人可以向我解释一下吗?谢谢.

Ric*_*sen 36

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

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

有关读取字段拆分的详细信息,请参阅POSIX规范.


Emi*_*röm -4

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

我猜他们在这里添加IFS=只是为了确保它对每个人都有效,无论 IFS 变量的先前值如何。该代码应该仍然可以工作,无需IFS=

  • 这个答案是不正确的——“IFS”被设置为空字符串,以防止“read”从每行中去除前导和尾随空格。 (15认同)
  • IFS 不是行分隔符,它是**字段**分隔符。这意味着它用于分隔两行和行内。但在本例中,由于您使用带有单个输出变量的“read”,因此它可以工作。例如,如果您想更快地解析 /etc/resolv.conf,您可以使用 `while IFS=' ' read -r name address` 在同一操作中拆分字段。 (5认同)
  • user121870,是的,这是允许的。当将变量放在命令前面时,该变量仅对该命令可见。这适用于所有 Bash 命令,甚至是您自己在终端中编写的命令。例如尝试以下命令:“MANWIDTH=20 man bash”。 (2认同)