que tiene la variable $foo="something"
y le gustaría usar:Bash - variables variables
bar="foo"; echo $($bar)
para conseguir "algo" se hizo eco.
que tiene la variable $foo="something"
y le gustaría usar:Bash - variables variables
bar="foo"; echo $($bar)
para conseguir "algo" se hizo eco.
eval echo \"\$$bar\"
lo haría.
Tenga en cuenta las [implicaciones de seguridad de 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –
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 \") ' '' –
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.
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
@ 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
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}"
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. –