2012-05-25 13 views
26

que tiene la variable $foo="something" y le gustaría usar:Bash - variables variables

bar="foo"; echo $($bar) 

para conseguir "algo" se hizo eco.

+2

favor ver [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). Además, no debe intentar usar un signo de dólar en el lado izquierdo de una tarea. –

Respuesta

51

En bash, puede usar $ {! Variable} para usar las variables variables.

foo="something" 
bar="foo" 
echo "${!bar}" 
+0

Mucho mejor que mi respuesta. – mkb

+0

@mkb No sabía eval :-) – dAm2K

+0

en 'sh' dice mala sustitución. ¿Alguna idea de cómo hacerlo en 'sh'? –

5

eval echo \"\$$bar\" lo haría.

+5

Tenga en cuenta las [implicaciones de seguridad de 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –

+0

Esta solución tiene la ventaja de ser compatible con POSIX para shells que no son Bash (por ejemplo, entornos livianos como sistemas embebidos o contenedores Docker). Y se puede asignar el valor de otra variable, así: '' 'sh var = $ (eval echo \ "\ $$ bar \") ' '' –

6

La respuesta aceptada es genial. Sin embargo, @Edison preguntó cómo hacer lo mismo para las matrices. El truco es que quieres que tu variable contenga el "[@]", de modo que la matriz se expanda con el "!". Echa un vistazo a esta función para volcar variables:

$ function dump_variables() { 
    for var in "[email protected]"; do 
     echo "$var=${!var}" 
    done 
} 
$ STRING="Hello World" 
$ ARRAY=("ab" "cd") 
$ dump_variables STRING ARRAY ARRAY[@] 

Este salidas:

STRING=Hello World 
ARRAY=ab 
ARRAY[@]=ab cd 

Cuando se administra como acaba de ARRAY, se muestra el primer elemento ya que eso es lo que se expandió por el !. Al dar el formato ARRAY[@], obtienes la matriz y todos sus valores se expanden.

+0

Buen punto acerca del manejo de matrices. ¿Alguna idea de cómo obtener los * índices * de una matriz? El [manual] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) indica que esto normalmente se hace con '$ {! ARRAY [@]}', lo que parece para entrar en conflicto con la sintaxis de indirección variable. – dimo414

+0

@ dimo414 Sí, obtener las claves indirectamente es más complicado. Tendría que pasar solo el nombre, luego hacer la expansión en el método: 'local -a 'keys = (" $ {!' "$ Var" '[@]} ")''. El [artículo indirecto sobre Bash Hackers] (http://wiki.bash-hackers.org/syntax/arrays#indirection) entra en más profundidad. – bishop

0

Para hacer más claro cómo hacerlo con matrices:

arr=('a' 'b' 'c') 
# construct a var assigning the string representation 
# of the variable (array) as its value: 
var=arr[@]   
echo "${!var}" 
Cuestiones relacionadas