2010-10-18 22 views
27

Me disculpo por la bastante terrible título - y el pobre calidad post - pero lo que básicamente quiero hacer es esto:¿Es posible construir nombres variables de otras variables en bash?

for I in 1 2 3 4 
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc. 

Obviamente lo anterior no funciona - que (creo) tratar de hacerse eco de la variable llamada $VAR$I ¿Es esto posible en Bash?

Respuesta

33

Sí, pero no hagas eso. Use una matriz en su lugar.

Si todavía insiste en hacerlo de esa manera ...

$ foo1=123 
$ bar=foo1 
$ echo "${!bar}" 
123 
+5

+1 para pero no hacer eso. Use una matriz en su lugar. – Nifle

+0

Gracias por el consejo sobre las matrices. Utilizando su publicación y la de pax, logré que funcionase. Animo amigos. – Stephen

+0

no funciona para 'kshell' – g4ur4v

4

Usted debe pensar acerca del uso de matrices bash para este tipo de trabajo:

pax> set arr=(9 8 7 6) 
pax> set idx=2 
pax> echo ${arr[!idx]} 
7 
0

Esto parece definitivamente como un tipo de matriz de situación. Aquí hay un enlace que tiene una muy buena discusión (con muchos ejemplos) de cómo utilizar matrices en bash: Arrays

10
for I in 1 2 3 4 5; do 
    TMP="VAR$I" 
    echo ${!TMP} 
done 

Tengo una regla general de que si necesito un acceso indirecto a las variables (arrays ídem), entonces es hora de convertir el script de shell a Perl/Python/etc. La codificación avanzada en shell aunque sea posible rápidamente se convierte en un desastre.

4

Para el caso en el que no desea refactorizar sus variables en matrices ...

Una forma ...

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done 

Otra forma ...

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done 

No he encontrado una manera más simple que funcione. Por ejemplo, esto no funciona ...

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done 
bash: ${!VAR$I}: bad substitution 
+1

Parte de mi respuesta fue publicada anteriormente por @ Dummy00001 - la única persona que realmente había respondido la pregunta como se le había pedido. – nobar

1
+0

Habría sido agradable transcribir alguna parte de la página enlazada para una comprensión directa en su respuesta ... ¡pero una gran referencia! –

3
for I in {1..5}; do 
    echo $((VAR$I)) 
done 
Cuestiones relacionadas