2012-05-17 9 views
5

Ho uno script che itera su una serie di valori, qualcosa di simile (storditi ai fini di questa domanda):Iterare su bash array, sostituire dinamicamente il nome dell'array, è possibile?

COUNTRIES=(ENGLAND SCOTLAND WALES) 

for i in ${COUNTRIES[@]} 
do     
    echo "Country is $i " 
done 

La mia domanda è, è possibile sostituire l'array dinamico? Ad esempio, voglio essere in grado di passare l'array per iterare a runtime. Ho provato quanto segue ma penso che la mia sintassi potrebbe essere sbagliato

COUNTRIES=(ENGLAND SCOTLAND WALES) 
ANIMALS=(COW SHEEP DOG) 

loopOverSomething() 
{ 
    for i in ${$1[@]} 
    do     
     echo "value is $i " 
    done 
} 

loopOverSomething $ANIMALS 

mi sto line 22: ${$2[@]}: bad substitution

+1

+1 per ben affermato e concentrato problema, i messaggi di codice di esempio e di errore inclusi. In bocca al lupo. – shellter

risposta

4

È possibile utilizzare l'espansione indiretta di bash per questo:

loopOverSomething() 
{ 
    looparray="$1[@]" 
    for i in "${!looparray}" 
    do 
     echo "value is $i" 
    done 
} 
+1

Hai provato questo? Certamente non funziona esattamente come-dato, e la voce BashFAQ sull'argomento indica che _won't_. –

+0

L'ho provato ... e poi ho fatto un errore di copia-incolla quando l'ho postato. Dovrebbe essere risolto ora. –

0

è possibile utilizzare il array come argomento nel seguente modo:

COUNTRIES=(ENGLAND SCOTLAND "NEW WALES") 
ANIMALS=(COW SHEEP DOG) 

loopOverSomething() 
{ 
    for i in "[email protected]" 
    do     
     echo "value is $i " 
    done 
} 

loopOverSomething "${ANIMALS[@]}" 
loopOverSomething "${COUNTRIES[@]}" 
+1

-1 per non utilizzare le virgolette - se 'countries = (" Nuovo Galles "Inghilterra)', "Nuovo" e "Galles" saranno considerati come voci separate. –

+0

@CharlesDuffy Ci dispiace, hai ragione. Ho appena copiato il codice di OP. – sgibb

0

Questo è coperto da BashFAQ #006:

non siamo a conoscenza di alcun trucco che può duplicare tale funzionalità in POSIX o Bourne shell (a corto di utilizzare eval, che è estremamente difficile da fare in modo sicuro). Bash può quasi farlo - alcuni trucchi di array indiretti funzionano, mentre altri no, e non sappiamo se la sintassi implicata rimarrà stabile nelle versioni future. Quindi, considera questo un uso a tuo rischio.

# Bash -- trick #1. Seems to work in bash 2 and up. 
realarray=(...) ref=realarray; index=2 
tmp="$ref[$index]" 
echo "${!tmp}"   # gives array element [2] 

# Bash -- trick #2. Seems to work in bash 3 and up. 
# Does NOT work in bash 2.05b. 
tmp="$ref[@]" 
printf "<%s> " "${!tmp}"; echo # Iterate whole array. 
Problemi correlati