为什么在“读”单个变量时需要关心“$IFS”?

为什么在“读”单个变量时需要关心“$IFS”?

类似的构造IFS= read -r var通常被视为 Bash 中将一行输入读入变量的“规范”方式(例如在unix.SE上)。

很明显,为什么设置一个空$IFS通常可能是有益的,即控制(防止)分词。然而,我很难理解为什么在阅读时特别需要这样做单身的多变的? bash 手册说:

如果单词数多于姓名,则剩余的单词及其中间分隔符将分配给姓氏

因此,即使不更改 IFS,如果read传递单个变量,那么它最终不应该根据需要将整行保存到该变量中吗?$IFS这种情况下设置空的原因是什么?

答案1

考虑这个示例(取消设置$IFS以便使用默认值):

$ unset IFS
$ IFS= read -r foo <<<" a "
$ printf "%q\n" "$foo"
\ a\
$ read -r foo <<<" a "
$ printf "%q\n" "$foo"
a

或者当它包含不同的值时(在 bash 或除 zsh 之外的其他类似 POSIX 的 shell 中):

$ IFS=:
$ IFS= read -r foo <<< "a:"
$ printf "%q\n" "$foo"
a:
$ read -r foo <<< "a:"
$ printf '%q\n' "$foo"
a

此案例涵盖问题中提到的帖子(强调):

现在,如果仅传递一个参数,则不会变成read line.依然是read remaining_words。反斜杠处理仍然完成,IFS 空白字符²仍从开头和结尾删除

相关内容