在我的GNU bash, version 4.3.42(1)-release我做了一些测试,以回答问题.我们的想法是将一个:分离的字符串及其每个元素拆分成一个数组.
为此,我尝试在命令的范围内设置IFSto :,以便拆分是自动的并IFS保持不变:
$ myvar="a:b:c"
$ IFS=: d=($myvar)
$ printf "%s\n" ${d[@]}
a
b
c
Run Code Online (Sandbox Code Playgroud)
显然IFS仍然是这样的:
$ echo $IFS
# empty
该BASH参考说:
如果未设置IFS,则参数由空格分隔.如果IFS为null,则连接参数时不会插入分隔符.
但是,我注意到它IFS有点破碎,所以echo $myvar返回a b c而不是a:b:c.
取消设置值可以解决它:
$ unset IFS
$ echo $myvar
a:b:c
Run Code Online (Sandbox Code Playgroud)
但我想知道:是什么导致了这个?是不是IFS=: command改变IFS只是在执行命令的范围是什么?
$ IFS=: eval 'd=($myvar)'
$ echo $myvar
a:b:c
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么会这样做而IFS=: d=($myvar)不是.
当我看到你使用它时,我会对此发表评论,但直到现在才发生问题.这条线
IFS=: d=($myvar)
Run Code Online (Sandbox Code Playgroud)
不暂时设定IFS; 它只是在当前shell中设置两个变量.(简单命令可以使用本地环境设置作为前缀,但赋值语句本身并不是一个简单的命令.)
当你写作
echo $IFS
Run Code Online (Sandbox Code Playgroud)
IFS扩展为:,但因为:是第一个字符IFS,它在分词时被删除.运用
echo "$IFS"
Run Code Online (Sandbox Code Playgroud)
会显示IFS仍然设置为:.