2012-05-17 9 views
5

tengo un script que itera sobre una matriz de valores, algo como esto (callados a los efectos de esta pregunta):Iteraciones sobre arreglos de bash, sustituya dinámicamente el nombre de la matriz, ¿es esto posible?

COUNTRIES=(ENGLAND SCOTLAND WALES) 

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

Mi pregunta es, ¿es posible sustituir la matriz de forma dinámica? Por ejemplo, quiero poder pasar la matriz para iterar en el tiempo de ejecución. He intentado lo siguiente pero creo que mi sintaxis podría estar mal

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

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

loopOverSomething $ANIMALS 

Me estoy line 22: ${$2[@]}: bad substitution

+1

+1 para el bien establecido y el problema se centró, ejemplos de códigos y mensajes de error incluido. Buena suerte. – shellter

Respuesta

4

Usted puede utilizar la expansión indirecta de fiesta para esto:

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

¿Has probado esto? Ciertamente no funciona exactamente como está dado, y la entrada de BashFAQ sobre el tema indica que no lo hará. –

+0

Lo probé ... y luego cometí un error de copiar y pegar cuando lo publiqué. Debería ser arreglado ahora. –

0

podría utilizar el array como argumento de la siguiente manera:

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 por no usar comillas, si 'countries = (" New Wales "England)', "New" y "Wales" se tratarán como entradas separadas. –

+0

@CharlesDuffy Lo siento, tienes razón. Acabo de copiar el código de OP. – sgibb

0

Esto está cubierto por BashFAQ #006:

No tenemos conocimiento de cualquier truco que puede duplicar esa funcionalidad en POSIX o conchas Bourne (corto de utilizar eval, que es extremadamente difícil de hacer con seguridad). Bash casi puede hacerlo: algunos trucos de matriz indirectos funcionan, y otros no, y no sabemos si la sintaxis involucrada se mantendrá estable en lanzamientos futuros. Por lo tanto, considere esto un uso en su propio riesgo de pirateo.

# 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. 
Cuestiones relacionadas