Por que essa sintaxe não funciona para declarar array associativo [closed]?

4

Posso usar uma variável dentro () sintaxe

#!/bin/bash
declare -A c
declare -A b
a="[a]=0 [b]=1 [c]=2 [d]=3"
b=($a) # or b=($(echo "$a"))
echo "***********${b[@]}*********"  #********************

c=([a]=0 [b]=1 [c]=2 [d]=3)
echo "---------${c[@]}----------"  #---------0 1 2 3----------
    
por munish 12.10.2013 / 14:38

2 respostas

6

Atualmente, não é possível (que eu saiba) ser capaz de pegar strings e criar matrizes associativas com eles no Bash. Portanto, você deve "avaliá-los" antes de usar a instrução eval .

Quando executo seu exemplo, recebo o seguinte usando a versão 4.1.7 do Bash:

$ ./arr.bash 
./arr.bash: line 5: b: [a]=0: must use subscript when assigning associative array
./arr.bash: line 5: b: [b]=1: must use subscript when assigning associative array
./arr.bash: line 5: b: [c]=2: must use subscript when assigning associative array
./arr.bash: line 5: b: [d]=3: must use subscript when assigning associative array

Alterando a linha para isso funciona:

eval "b=($a)" # or b=($(echo "$a"))

Re-executando você agora obtém os resultados esperados:

$ ./arr.bash 
***********0 1 2 3*********
---------0 1 2 3----------

Explicação

Eu encontrei este SO Q & A intitulado: Bash: Como atribuir uma matriz associativa a outro nome de variável (por exemplo, renomear a variável)? , que ilustra um método para fazer isso usando declare , mas vai mostrar como ilegível este método é realmente, e provavelmente não deveria ser usado.

# declare associative array
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
# convert associative array to string
assoc_array_string=$(declare -p assoc_array)
# create new associative array from string
eval "declare -A new_assoc_array="${assoc_array_string#*=}
# show array definition
declare -p new_assoc_array

Este método mostra o $assoc_array sendo convertido em uma string e depois convertido de volta para uma matriz associativa, $new_assoc_array . Mas mesmo esse método não pode escapar da necessidade de usar eval . Este é um trecho de código difícil de seguir e mostra por que ele realmente deveria ser evitado.

    
por 12.10.2013 / 16:42
2

Você precisa

eval "b=($a)"

eval avaliará seu argumento como um comando shell após executar a expansão de parâmetro. Use com cuidado, no entanto. Certifique-se de que $a não seja definido pela entrada do usuário, pois isso pode levar a todos os tipos de problemas.

    
por 12.10.2013 / 15:08

Tags