在我的GNU bash版本为4.3.42(1)-release的环境中,我正在进行一些测试来回答一个问题。这个想法是将一个以冒号分隔的字符串拆分成一个数组,然后对其每个元素进行操作。
为此,我尝试在命令的范围内将
但我不明白为什么它会生效,而
为此,我尝试在命令的范围内将
IFS
设置为:
,以便自动拆分并保持IFS
不变:$ myvar="a:b:c"
$ IFS=: d=($myvar)
$ printf "%s\n" ${d[@]}
a
b
c
显然 IFS
保持不变:
$ echo $IFS # 空的
BASH reference 声明如下:
如果未设置 IFS,则参数将以空格分隔。如果 IFS 为空,则参数将连接在一起而没有分隔符。
然而,我注意到 IFS
有点损坏,因此 echo $myvar
返回 a b c
而不是 a:b:c
。
取消设置值即可解决问题:
$ unset IFS
$ echo $myvar
a:b:c
但我想知道:是什么导致了这种情况?难道 IFS=: command
只在执行命令的范围内改变了 IFS
吗?
我在 为单个语句设置IFS 中看到确实可以这样做:
$ IFS=: eval 'd=($myvar)'
$ echo $myvar
a:b:c
但我不明白为什么它会生效,而
IFS=: d=($myvar)
则不会。
echo $IFS
和echo "$IFS"
之间的区别,你提出了一个很好的观点。正如每个人都说的那样,在bash中引用你的变量。 :-) - ghotiIFS
的循环使用影响了$IFS
的显示;我非常确定赋值语句没有环境,但我无法立即找出为什么echo $IFS
似乎显示旧值。 :) - chepnerprintf "%q\n" "$IFS"
,因为这样可以显示$IFS可能具有的空格值。 - dawgIFS
的值中没有任何空格,而只有先前分配的:
。 - chepner