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 stringMe 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)
$testPero aquí el resultado es $testy 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
varprefijo$puede usareval:Qué pasa aquí:
$varal valor$test, produciendo uneval echo $testcomando;evalevalúa laecho $testexpresión y produce un resultado deseado.Tenga en cuenta que el uso
evalen 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 usarevalque mencionaste.Similar a la respuesta de Jesse_b , pero usando una variable de referencia de nombre en lugar de indirecta variable (requiere
bash4.3+):La variable de referencia de nombre
varcontiene 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.bashresuelve referencias de nombre de forma recursiva:Para completar, usar una matriz asociativa (en
bash4.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
zshes una excepción) yechono se pueden usar para datos arbitrarios.Dado que con ambos
(e)yevalhay una evaluación del código de shell, es importante que el contenido$varpermanezca 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