existe uma maneira de listar todos os 'IDs de índices' (chaves) em uma variável de matriz associativa do bash?

26

Eu tenho essa matriz:

declare -A astr

Eu adiciono elementos a ele:

astr[elemA]=123
astr[elemB]=199

Mais tarde, porém, preciso saber quais são os IDs de índices (elemA e elemB) e listá-los.

echo "${astr[@]}" #this only get me the values...
Aquarius Power
fonte

Respostas:

35

Você pode obter a lista de "chaves" para a matriz associativa da seguinte forma:

$ echo "${!astr[@]}"
elemB elemA

Você pode iterar sobre as "chaves" da seguinte maneira:

for i in "${!astr[@]}"
do   
  echo "key  : $i"
  echo "value: ${astr[$i]}"
done

Exemplo

$ for i in "${!astr[@]}"; do echo "key  : $i"; echo "value: ${astr[$i]}"; done
key  : elemB
value: 199
key  : elemA
value: 123

Referências

slm
fonte
11
Acabei de descobrir que também funciona para matrizes numeradas indexadas também: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Aquarius Power
@AquariusPower - Sim, se você reverter as edições na minha resposta, verá que originalmente eu também incluí o índice numérico, mas o soltei porque você queria hashes.
slm
Note-se que ${!var[index]}não trabalho, única ${!var[@]}ou ${!var[*]}fazer :(
i336_
@ i336_ - retire o que está !fora ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm
Desculpe, esclarecimentos: eu estava tentando determinar a chave associativa do índice numérico n . Percebi que posso fazer com facilidade keys=(${!var[@]})e ${keys[n]}, então , fornecendo o índice, mas, ao mesmo tempo, também percebi que precisava repensar minha abordagem.
I336_