Bem, "${array[@]}"
fornece os valores da matriz, isso é tudo. Eu não acho que deveria ter algum problema com isso.
Mas não fornece nada além dos valores, como índices (como você mencionou) ou outros atributos. Matrizes de bash podem ser somente leitura ou ter os atributos integer ou upper / lowercase. O mesmo acontece com os arrays associativos: o resultado dessa atribuição seria um array indexado regular, mas perder os índices seria o maior problema. Os atributos provavelmente seriam fáceis, você provavelmente saberia quais atributos você definiu no array.
Uma atribuição como array2=("${array1[@]}")
removeria todos os valores originais de array2
, portanto não há nenhum problema com os dados restantes. Os atributos de array2
seriam mantidos e, se fosse definido um array inteiro, os valores de array2
seriam tomados como expressões aritméticas. (O mesmo que em a="1 + 3"; declare -i b=$a; echo $b
, que imprime "4".)
Para copiar os índices também, você precisa usar um loop (e definir os atributos manualmente):
# declare -A arr2 # if it was an associative array
arr2=() # clear the target
for k in "${!arr[@]}" ; do arr2[$k]=${arr[$k]} ; done
Ou, para obter uma cópia exata, atributos e tudo, a saída de declare -p
pode ser usada como entrada para o shell, portanto, deve copiar ai1
para ai2
com todas as chaves e atributos:
declare -Ai ai1=([foo]=123 [$'a tricky key\n']=456)
definition=$(declare -p ai1)
eval "${definition/ ai1/ ai2}"
As operações de sequência como ${var/pat/repl}
funcionam em todos os valores. Eu não acho que você deveria ter outros problemas com isso também. Embora eu ache que o asterisco no seu padrão esteja equivocado, pois ${var/pat/repl}
, juntamente com ${var##pat}
, leva a correspondência mais longa, então "${var/#prefix*/}"
limparia todo o valor.
Você provavelmente deseja "${myArray[@]#unwanted-prefix}"
.