Shell, concatenando 2 strings para hacer reference a una tercera variable

Estoy tratando de hacer lo siguiente en mi script:

#/bin/bash -x var1=www var2=www2 var3=www3 var4=www4 for i in 1 2 3 4; do echo \$var$i done 

Obviamente, esto no funciona como se esperaba y da como resultado el siguiente resultado:

 $var1 $var2 $var3 $var4 

¿Cómo puedo hacer una reference dinámica de las variables en mi ciclo?

¿Estás buscando esto?

 $ cat indirection.bash #!/bin/bash -x var1=www var2=www2 var3=www3 var4=www4 for i in 1 2 3 4; do s="var${i}" echo "${!s}" done 

 $ ./indirection.bash www www2 www3 www4 

Puedes usar una matriz:

 #/bin/bash -x declare -a vars=( www www2 www3 www4 ) for var in "${vars[@]}"; do echo "$var" done 

O iterar con el índice:

 for i in "${!vars[@]}"; do echo "${vars[$i]}" done 

Normalmente shell expande variable solo una vez. Puede usar la expansión indirecta o preguntar al shell para expandirlo una vez más, por ejemplo:

 eval "val=\$var$i"; echo "$val"; 

en lugar de simplemente

 echo "\$var$i" 

Este método es muy portable, pero usa evil eval .

Usando la expansión indirecta como se muestra en otras respuestas (ver Expansión de parameters en man bash ) ${!VAR_NAME} es una buena solución, cuando la portabilidad no es necesaria y se le permite usar extensiones de BASH.

Use una matriz asociativa . No hay una buena razón para generar nombres de variables como este.