将数组分配给变量的缺点如下: array2=("${array1[@]}")

将数组分配给变量的缺点如下: array2=("${array1[@]}")

我可以将一个数组复制到另一个数组,如下所示:

array2=("${array1[@]}")

这种方法的缺点之一是索引不会被保留。例如:如果有三个带有索引和的array1元素,则将具有索引和和。125array2123

还有其他缺点吗?

答案1

好吧,"${array[@]}"给你数组的值,仅此而已。我认为这应该不会有任何问题。

但它不会为您提供值之外的任何内容,例如索引(正如您提到的)或其他属性。 Bash 数组可以是只读的,或者具有整数或大写/小写属性。当然,关联数组也是如此:该赋值的结果将是一个常规索引数组,但丢失索引将是更大的问题。属性可能很简单,您可能知道在数组上设置了哪些属性。

像这样的赋值array2=("${array1[@]}")会删除 的所有原始值array2,因此剩余数据没有问题。但的属性array2将被保留,如果它设置为整数数组,则 的值array2将被视为算术表达式。 (与 中相同a="1 + 3"; declare -i b=$a; echo $b,打印“4”。)

要也复制索引,您需要使用循环(并手动设置属性):

# declare -A arr2    # if it was an associative array
arr2=()              # clear the target
for k in "${!arr[@]}" ; do arr2[$k]=${arr[$k]} ; done 

或者,要获得精确的副本、属性和所有内容, 的输出declare -p 可用作 shell 的输入,因此应该复制ai1ai2所有键和属性:

declare -Ai ai1=([foo]=123 [$'a tricky key\n']=456)
definition=$(declare -p ai1)
eval "${definition/ ai1/ ai2}"

字符串操作类似于${var/pat/repl}对所有值的操作。我认为您也不应该对此有任何其他问题。尽管我确实认为您的模式中的星号与最长的匹配${var/pat/repl}一起放错了位置,所以会清除整个值。${var##pat}"${var/#prefix*/}"

你可能想要的"${myArray[@]#unwanted-prefix}"是。

相关内容