答案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
变量打断(因为 上没有双引号)。这意味着字符将变得无关紧要,每个数字只是一个参数。当获取多个参数时,它将按照相同的顺序打印它们,并用空格字符分隔。IFS
echo
x
<newline>
echo