2010-04-14 13 views
17
x=1 
c1=string1 
c2=string2 
c3=string3 

echo $c1 
string1 

me gustaría tener la salida sea string1 utilizando algo como: echo $(c($x))Usando una variable para hacer referencia a otra variable en Bash

Así adelante en la secuencia de comandos que puede incrementar el valor de x y haga que emita string1, luego string2 y string3.

¿Alguien puede indicarme la dirección correcta?

+1

Usa una matriz. Lee 'hombre bash'. –

+0

Tenía exactamente la misma pregunta. – User1

+0

Consulte [Variables indirectas en Bash] (https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean) también. – codeforester

Respuesta

22

Ver el Bash FAQ: How can I use variable variables (indirect variables, pointers, references) or associative arrays?

Para citar su ejemplo:

realvariable=contents 
ref=realvariable 
echo "${!ref}" # prints the contents of the real variable 

para mostrar cómo esto es útil para su ejemplo:

get_c() { local tmp; tmp="c$x"; printf %s "${!tmp}"; } 
x=1 
c1=string1 
c2=string2 
c3=string3 
echo "$(get_c)" 

Si, por supuesto, usted quiere hacerlo de la manera correcta y justa use an array:

c=("string1" "string2" "string3") 
x=1 
echo "${c[$x]}" 

Tenga en cuenta que estos arreglos son indexados a cero, por lo que con x=1 imprime string2; si quiere string1, necesitará x=0.

+0

excelente. Después de su edición, se vuelve claro como el cristal y es mi elección preferida. Muchas gracias por su tiempo y conocimiento. – user316100

2

si tiene bash 4.0, puede usar associative arrays.. O simplemente puede usar arrays. Otra herramienta que puede utilizar es awk

por ejemplo

awk 'BEGIN{ 
    c[1]="string1" 
    c[2]="string2" 
    c[3]="string3" 
    for(x=1;x<=3;x++){ 
    print c[x] 
    } 
}' 
1

Prueba esto:

eval echo \$c$x 

Al igual que otros dijeron, tiene más sentido utilizar matriz en este caso.

+1

El uso de eval sin hacer las comillas apropiadas (como con 'printf% q') es bastante peligroso desde una perspectiva de seguridad, particularmente si su script maneja cualquier información que podría ser generada por procesos maliciosos o no confiables. (Incluso un nombre de archivo podría usarse para inyectar contenido malicioso, si eso es lo que estaba pasando). –

Cuestiones relacionadas