如何使用array2 =(“$ {array1 [@]}”)复制数组与直接赋值不同?

时间:2018-01-19 12:29:08

标签: bash

考虑以下将内容从一个数组复制到另一个数组的机制:

$ array1=( [1]=a [2]=b [5]=c )
$ array2=( "${array1[@]}" )

其中一个已知的副作用是指数不会被保留,可以证明如下:

# note that indices have changed from 1/2/5 to 0/1/2
$ declare -p array1 array2
declare -a array1='([1]="a" [2]="b" [5]="c")'
declare -a array2='([0]="a" [1]="b" [2]="c")'

使用此语法或其效果与直接分配array2=( [1]=a [2]=b [5]=c )的地方有任何其他副作用吗?

1 个答案:

答案 0 :(得分:0)

您命名的差异 - 丢弃索引 - 是唯一有效的差异(丢弃性能影响,这取决于版本,难以衡量)。也就是说,至少还有一个问题出在这个问题上:有问题的语法无法复制关联数据和数字索引数组。

这种语法的简洁性,清晰度和安全性(与使用eval等hackery相反)通常被认为是足以使其适用于保留索引不重要的情况下的一般用途。