使用 `echo` 和 `for` 的 POSIX 字段分割和双引号行为

使用 `echo` 和 `for` 的 POSIX 字段分割和双引号行为

根据 POSIX 标准场分裂,双引号,以及for循环和下面的示例,我无法理解为什么使用双引号 inecho "$s"显示数字之间的新行,而使用双引号 infor x in "$s"不显示数字之间的新行。有人可以澄清一下吗?

$ s=$(seq 1 4)
$ echo $s
1 2 3 4
$ echo "$s"
1
2
3
4
$ for x in $s; do echo $x; done
1
2
3
4
$ for x in "$s"; do echo $x; done
1 2 3 4

答案1

正如您所正确提到的,IFS(字段分割)环境变量在这里发挥着重要作用。通常,IFS设置为包括<space><tab>、 和<newline>字符。这意味着当变量上没有使用引号时,shell 解释器会IFS尽可能将其按值分解为单独的参数(甚至会压缩多个IFS字符)。

因此,在您的s变量中,始终存在以下值。其余的取决于解释。

1<newline>2<newline>3<newline>4

在第一个中for,shell$s在运行之前进行分割for并执行循环四次。对于以下内容echo,没有任何其他需要拆分的内容,因此每个元素都打印在一行上(这就是所做的echo)。

如上所述,第二个for将仅针对整个值运行一次。s现在发生的情况是 shell在传递 to 之前将s变量打断(因为 上没有双引号)。这意味着字符将变得无关紧要,每个数字只是一个参数。当获取多个参数时,它将按照相同的顺序打印它们,并用空格字符分隔。IFSechox<newline>echo

相关内容