¿hay alguna manera de enumerar todos los 'ID de índices' (claves) en una variable de matriz asociativa bash?

26

Tengo esta matriz:

declare -A astr

Le agrego elementos:

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

Pero más adelante necesito saber cuáles son los ID de los índices (elemA y elemB) y enumerarlos.

echo "${astr[@]}" #this only get me the values...
Poder de acuario
fuente

Respuestas:

35

Puede obtener la lista de "claves" para la matriz asociativa de la siguiente manera:

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

Puede iterar sobre las "teclas" de esta manera:

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

Ejemplo

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

Referencias

slm
fuente
1
Acabo de encontrar que también funciona para matrices indexadas numéricamente también: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Acuario Power
@AquariusPower: Sí, si revierte las ediciones en mi respuesta, verá que originalmente también había incluido el índice numérico, pero luego lo eliminé ya que quería hashes con nombre.
slm
Tenga en cuenta que ${!var[index]}no funciona, solo ${!var[@]}o ${!var[*]}no :(
i336_
@ i336_: sáquelo, !así es ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm
Lo siento, aclaración: estaba tratando de determinar la clave asociativa para el índice numérico n . Me di cuenta de que puedo hacerlo fácilmente keys=(${!var[@]})y luego ${keys[n]}, dándome el índice, pero al mismo tiempo también me di cuenta de que necesitaba repensar mi enfoque.
i336_