有人可以解释这里发生了什么。所有这些都是在同一个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[*]}"
的价值。
答案 0 :(得分:1)
使用时:
IFS=/ echo "${array[*]}"
然后IFS被设置为echo命令的本地(虽然没有被echo使用)
使用时:
IFS=/ x="${array[*]}"
然后这两个是分开的变量赋值,一个用于IFS,一个用于x,因此IFS现在永久地更改为/
,如@jaypal所述。
使用时:
$ echo "${array[*]}"
然后 - 引用时 - IFS的第一个字符用作输出字段分隔符,扩展数组
如果它没有引用,则它会产生空格分隔的字段:
$ echo ${array[*]}
此外,当你使用:
$ echo "${array[@]}"
然后将每个数组元素扩展为一个单独的单词,因此不使用输出字段分隔符,因此它变为单个空格。
答案 1 :(得分:0)
首先,一些非常简单的案例来解释混淆的来源。我将使用正确的引用,虽然这里不需要,因为我们将使用单个字符串操作。
$ x=y echo "$x"
$ echo "$x"
$
这里发生了两件事:
echo "$x"
返回一个空字符串。echo "$x"
也返回一个空字符串。实际上,x=y
在这种情况下绝对没有任何作用。$ x=y z="$x"
$ echo "$x"
y
$ echo "$z"
y
$
现在两点相反:
x
和z
都设置为y
。这些都是肯定的,并且值得向不熟悉它们的人解释。然而,对我来说,问题主要是关于任务,一旦澄清,其他一切都落实到位。请注意,IFS
的值适用于不带引号的$IFS
本身。因此echo $IFS
将始终返回一个空行:
$ IFS=BOO
$ echo $IFS
$