我可以将一个数组复制到另一个数组,如下所示:
array2=("${array1[@]}")
这种方法的缺点之一是索引不会被保留。例如:如果有三个带有索引和的array1
元素,则将具有索引和和。1
2
5
array2
1
2
3
还有其他缺点吗?
答案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 的输入,因此应该复制ai1
到ai2
所有键和属性:
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}"
是。