3

有人可以解释这里发生了什么。所有这些都在同一个 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[*]}".

4

2 回答 2

1

当您使用:

IFS=/ echo "${array[*]}"

然后将 IFS 设置为 echo 命令的本地(虽然不被 echo 使用)

当您使用:

IFS=/ x="${array[*]}"

然后这是两个单独的变量赋值,一个用于 IFS,一个用于 x,因此 IFS 现在永久更改/为@jaypal 提到的。

当您使用:

$ echo "${array[*]}"

然后 - 当引用时 - IFS 的第一个字符用作输出字段分隔符并扩展数组

如果它没有被引用,那么它会产生空格分隔的字段:

$ echo ${array[*]}

此外,当你会使用:

$ echo "${array[@]}"

然后将每个数组元素扩展为一个单独的单词,因此不使用输出字段分隔符,因此它成为单个空格..

于 2014-03-02T07:06:16.813 回答
0

首先,一些非常简单的案例来解释混淆的来源。我将使用正确的引用,虽然这里不需要,因为我们将使用单个字符串进行操作。

案例 A:一个赋值,后面跟着一个命令。

$ x=y echo "$x"

$ echo "$x"

$ 

这里发生了两件事:

  • 当后跟命令时,分配仅对该命令是本地的。这就是为什么第二个echo "$x"返回一个空字符串。
  • 在执行分配之前,首先发生参数扩展。这就是为什么第一个echo "$x"也返回一个空字符串。实际上,x=y在这种情况下绝对什么都不做。

案例 B:同一行上的两个作业。

$ x=y z="$x"
$ echo "$x"
y
$ echo "$z"
y
$ 

同样的两点现在相反:

  • 这两个分配对 shell 的其余部分都有效(或直到未设置)。
  • 参数扩展不会立即发生。执行第一次赋值,并将结果用于第二次赋值。因此,对于 shell 的其余部分,两者xz都设置为。y

数组、IFS 和引用。

当然,这些都发挥了作用,值得向不熟悉它们的人解释。然而,对我来说,问题主要是关于作业的,一旦澄清了,其他一切就都到位了。请注意,该值IFS适用于未引用的$IFS自身。所以echo $IFS总是会返回一个空行:

$ IFS=BOO
$ echo $IFS

$ 
于 2014-03-02T08:50:20.113 回答