谁能解释一下这是怎么回事。所有这些都在同一个 shell 中连续执行。
$ array=(a b c)
$ echo "${array[*]}"
a b c
到目前为止一切顺利。
$ IFS=/ echo "${array[*]}"
a b c
没关系,扩展发生在整行执行之前。
$ IFS=/ x="${array[*]}"
$ echo $x
a b c
这里也是一样,展开先发生,x
得到那个值。
$ echo "${array[*]}"
a/b/c
但是 ${array[*]}
发生了变化,而且变化是永久性的。
$ x="${array[*]}"
$ echo $x
a b c
好的,我认为这很正常 - 原始的默认 IFS
值用于扩展此赋值中的数组变量。
$ echo "${array[*]}"
a/b/c
$
但这对我来说完全没有意义。首先,这里没有使用默认的 IFS
。其次,赋值 x="${array[*]}"
并没有像以前那样影响 ${array[*]}
的值,在 IFS=/x="${array[*]}"
中。
最佳答案
当您使用时:
IFS=/ echo "${array[*]}"
然后将 IFS 设置为 echo 命令的本地(尽管 echo 未使用)
当您使用时:
IFS=/ x="${array[*]}"
然后这是两个单独的变量赋值,一个用于 IFS,一个用于 x,因此 IFS 现在永久更改为 /
,如@jaypal 所述。
当您使用时:
$ echo "${array[*]}"
然后 - 当引用时 - IFS 的第一个字符用作输出字段分隔符并扩展数组
如果不加引号,则生成空格分隔的字段:
$ echo ${array[*]}
另外,当你会使用:
$ echo "${array[@]}"
然后每个数组元素被扩展为一个单独的单词,因此不使用输出字段分隔符,因此它变成一个空格..
关于arrays - Bash:使用 IFS 将数组连接成字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22124417/