Supongamos que he declarado las siguientes variables:
$ var='$test'
$ test="my string"
Si imprimo su contenido, veo lo siguiente:
$ echo $var
$test
$ echo $test
my string
Me gustaría encontrar una manera de imprimir el contenido del contenido de $var
(que es el contenido de $test
). Entonces intenté hacer lo siguiente:
$ echo $(echo $var)
$test
Pero aquí el resultado es $test
y no "my string"
... ¿Es posible imprimir el contenido del contenido de variables usando bash?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
fuente
fuente
ash
, obash
, ocsh
, odash
, ..., ozsh
, o POSIXsh
, o necesita trabajar en diferentes sistemas?Respuestas:
Puede lograr esto usando la expansión de variables indirectas de bash (siempre que esté bien que omita el
$
de su variable de referencia):3.5.3 Expansión del parámetro de la carcasa
fuente
Para el caso en que el nombre de la variable contenida en el
var
prefijo$
puede usareval
:Qué pasa aquí:
$var
al valor$test
, produciendo uneval echo $test
comando;eval
evalúa laecho $test
expresión y produce un resultado deseado.Tenga en cuenta que el uso
eval
en general puede ser peligroso (dependiendo de lo que esté almacenadovar
), por lo que prefiere evitarlo. La función de expansión indirecta es mejor para su caso (pero debe deshacerse del$
inicio de sesión$test
).fuente
eval
, se necesitan dos capas de comillas dobles, la línea siguiente:eval echo "\"$var\""
. Eso sí, esto no hace nada sobre los otros peligros de usareval
que mencionaste.Similar a la respuesta de Jesse_b , pero usando una variable de referencia de nombre en lugar de indirecta variable (requiere
bash
4.3+):La variable de referencia de nombre
var
contiene el nombre de la variable a la que hace referencia. Cuando la variable se desreferencia como$var
, se devuelve el valor de esa otra variable.bash
resuelve referencias de nombre de forma recursiva:Para completar, usar una matriz asociativa (en
bash
4.0+) también es una forma de resolver esto, dependiendo de los requisitos:Esto proporciona una forma más flexible de acceder a más de un valor por una clave o nombre que puede determinarse dinámicamente. Esto puede ser preferible si desea recopilar todos los valores de una categoría particular en una sola matriz, pero aún así puede acceder a ellos mediante alguna clave (por ejemplo, nombres accesibles por ID o nombres de ruta accesibles por propósito, etc.) ya que no contamina El espacio de nombres variable del script.
fuente
Con
zsh
:Con cualquier caparazón tipo Bourne
Recuerde que en esos shells se deben citar las expansiones variables para evitar split + glob (que
zsh
es una excepción) yecho
no se pueden usar para datos arbitrarios.Dado que con ambos
(e)
yeval
hay una evaluación del código de shell, es importante que el contenido$var
permanezca bajo su control, ya que de lo contrario puede ser una vulnerabilidad de inyección de comando arbitraria (lo mismo con los${!var}
enfoques).fuente