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.