Estou tentando construir uma matriz associativa onde pares de valores-chave dentro da matriz fazem referência a outros pares de valores-chave na mesma matriz, usando Debian Gnu-Linux 12.4, 22.12.3 e Bash 5.2.15.
Exemplo,
declare -A test=(
[0]=0
[1]=1
[2]=2
[3]=$((test[1]+test[2]))
[4]="${test[1]} ${test[2]}"
)
Quando executo as seguintes instruções echo no Konsole,
echo "${test[1]}"
echo "${test[2]}"
echo "${test[3]}"
echo "${test[4]}"
Às vezes consigo esse resultado,
1
2
0
e às vezes consigo o que pretendia
1
2
3
1 2
Por causa dessa inconsistência (que pode ser exclusivamente minha), tenho algumas perguntas.
- Isso pode ser feito?
- Se sim, existe uma maneira adequada de fazer isso?
Além disso, não consigo encontrar um método consistente para replicar os dois resultados diferentes, pois ambos acontecerão, não importa o que ou como.
Não da maneira que você está tentando fazer, porque as referências de variáveis não são armazenadas no array - em vez disso, elas são imediatamente avaliadas como parte da expressão 'string literal' - então, no momento em que a referência é avaliada, a atribuição a
test
ainda não foi feito. (O mesmo que em muitas outras linguagens de programação!)(Apesar da semelhança na sintaxe, apenas
test=…
outest[3]=…
é uma atribuição de variável real, mas( [0]=… )
não é - a sintaxe de chave/valor da matriz do Bash apenas imita atest[3]=…
sintaxe de atribuição real, mas em outras linguagens o mesmo conceito normalmente seria parecidotest = { "0": 1234 }
ou semelhante.)Você precisará de várias tarefas para fazer isso corretamente:
Cada uma das quatro operações no exemplo acima é uma atribuição única; primeiro, todas as referências de variáveis e outras
$
expansões são processadas e, em seguida, o valor detest
é atualizado.Se você obtiver um resultado da expansão em seu exemplo, ele estará usando os valores de uma tarefa anterior . Coloque um
declare -p test
antes (e depois) da atribuição para ver quais valores estão armazenados.Para garantir consistência em seus experimentos, faça isso
unset test
antes de cada tentativa.