当"for word in $string"在空格上拆分时,为什么默认$IFS扩展到换行符?



>当我通过命令行执行下面的代码时:

(
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
)

我得到的结果是:

Word: foo:bar
Word: baz
Word: rab

这意味着$IFS将被解释为空格字符。 但是,我尝试通过执行以下操作来扭转它:

echo "foo:bar${IFS}baz${IFS}rab"

并打印:

foo:bar
baz
rab

现在这意味着$IFS是一个n.我本来以为"foo:bar baz rab"

是什么导致了这种不一致?

>IFS默认包含三个字符:空格(第一个(、制表符(第二个(、换行符(第三个(。

这意味着这三个字符中的任何一个都可以充当单词分隔符。$*只使用这三个单词中的第一个来分隔单词。

如果要从数组生成字符串(在 IFS 中由第一个字符分隔(,请考虑:

# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"

最新更新