Desvantagens de atribuir um array a uma variável como esta: array2 = (“$ {array1 [@]}”)

3

Eu posso copiar um array para outro assim:

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

Uma das desvantagens dessa abordagem é que os índices não serão preservados. Por exemplo: se array1 tiver três elementos com índices 1 e 2 e 5 , então array2 terá os índices 1 e 2 e 3 .

Existem outras desvantagens?

    
por user267935 04.01.2018 / 06:59

1 resposta

0

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}" .

    
por 16.02.2018 / 12:04

Tags