当 "for word in $string" 按空格拆分时,为什么默认 $IFS 扩展为换行符?
Why does default $IFS expand to a newline, when "for word in $string" splits on spaces?
当我通过命令行执行下面的代码时:
(
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
)
我得到的结果是:
Word: foo:bar
Word: baz
Word: rab
这意味着 $IFS
将被解释为 space 字符。
但后来我尝试通过执行以下操作来扭转它:
echo "foo:bar${IFS}baz${IFS}rab"
并打印:
foo:bar
baz
rab
这意味着 $IFS
是 \n
。我本以为 "foo:bar baz rab"
造成这种不一致的原因是什么?
IFS
默认包含 三个 个字符:Space(第一个)、制表符(第二个)、换行符(第三个)。
这意味着这三个字符中的任何一个都可以作为单词分隔符。 $*
仅使用这三个中的第一个来分隔单词。
如果要从数组生成字符串,以 IFS 中的第一个字符分隔,请考虑:
# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"
当我通过命令行执行下面的代码时:
(
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
)
我得到的结果是:
Word: foo:bar
Word: baz
Word: rab
这意味着 $IFS
将被解释为 space 字符。
但后来我尝试通过执行以下操作来扭转它:
echo "foo:bar${IFS}baz${IFS}rab"
并打印:
foo:bar
baz
rab
这意味着 $IFS
是 \n
。我本以为 "foo:bar baz rab"
造成这种不一致的原因是什么?
IFS
默认包含 三个 个字符:Space(第一个)、制表符(第二个)、换行符(第三个)。
这意味着这三个字符中的任何一个都可以作为单词分隔符。 $*
仅使用这三个中的第一个来分隔单词。
如果要从数组生成字符串,以 IFS 中的第一个字符分隔,请考虑:
# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"