Bash:使用IFS将数组连接成一个字符串

时间:2014-03-02 05:56:54

标签: arrays bash ifs

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

2 个答案:

答案 0 :(得分:1)

使用时:

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

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

使用时:

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

然后这两个是分开的变量赋值,一个用于IFS,一个用于x,因此IFS现在永久地更改为/,如@jaypal所述。

使用时:

$ echo "${array[*]}"

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

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

$ echo ${array[*]}

此外,当你使用:

$ echo "${array[@]}"

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

答案 1 :(得分: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

$