2010-06-24 17 views
224

Sulla base di un array associativo in uno script Bash, ho bisogno di scorrere su di esso per ottenere la chiave e il valore.Come iterare su array associativi in ​​Bash

#!/bin/bash 

declare -A array 
array[foo]=bar 
array[bar]=foo 

In realtà non capisco come ottenere la chiave durante l'utilizzo di un ciclo for-in.

+6

$ dichiarano -A Array = ([foo] = bar [bar] = foo) # inizializzare tutte a una volta – anisbet

+2

Per un piccolo elenco di valori chiave si potrebbe considerare questo: 'for i in a, b c_s, d; do KEY = $ {i%, *}; VAL = $ {i # *,}; echo $ KEY "XX" $ VAL; done' – math

risposta

400

Le chiavi sono accessibili usando un punto esclamativo: ${!array[@]}, il valori vengono visualizzate mediante ${array[@]}.

È possibile scorrere i coppie chiave/valore come questo:

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

Si noti l'uso di citazioni intorno alla variabile nell'istruzione for (più l'uso di @ invece di *). Questo è necessario nel caso in cui alcune chiavi includano spazi.

La confusione nel altra risposta deriva dal fatto che la domanda include "foo" e "bar" per entrambe le chiavi e i valori.

+2

Questo è ora se assegnare tutti i tasti ad una matrice: 'Array = ($ {hash [@]!})' –

+7

@ Michael-O: Hai bisogno per citare l'espansione del parametro per proteggere le chiavi che possono avere spazi bianchi: 'array = (" $ {! hash [@]} ")' –

+0

@DennisWilliamson, grazie mille. Non avevo questo nella mia mente. –

35

È possibile accedere alle chiavi con ${!array[@]}:

bash-4.0$ echo "${!array[@]}" 
foo bar 

Poi, scorrere il coppie chiave/valore è facile:

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

perfetto - grazie! – pex

+1

Ho avuto il "!" - non si accorse nemmeno, non c'era nessuno, mi dispiace .. :) – pex

4

Usare questa funzione di ordine superiore per evitare che l'esempio pyramid of doom

foreach(){ 
    arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; 
    for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done 
} 

:

$ bar(){ echo "$1 -> $2"; } 
$ declare -A foo["flap"]="three four" foo["flop"]="one two" 
$ foreach foo bar 
flap -> three four 
flop -> one two 
+1

Non sono sicuro di come sia applicabile? La piramide del destino non è un problema puramente estetico e in realtà applicabile solo nei linguaggi orientati agli oggetti? –

+1

potresti spiegarlo? La funzione foreach è un po 'complicata. Non capisco –

Problemi correlati