En bash, ¿cómo puedo repetir el nombre de la variable, no el valor de la variable? [cerrado]

18

Supongamos que tengo una variable varen bash. Puedo asignarle un valor. Por ejemplo, lo convertiré en una cadena:

var="Test"

Quiero echoel nombre de var, no el valor en poder de var. (Puedo hacer esto último echo $var, pero en realidad quiero hacer lo primero).

La respuesta a esta pregunta de SO dice usar echo ${!var}, pero cuando hago eso, echo solo devuelve una línea en blanco. Por ejemplo, este script bash

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"

devuelve esta salida:

Hi

Bye

con solo una línea en blanco entre Hi y Bye , en lugar de var . ¿Qué estoy haciendo mal?

Estoy ejecutando bash 4.1.5 (1) en Ubuntu 10.04.4 .

Andrés
fuente
11
Err ... solo echo var?
Braiam
55
Realmente no entiendo el punto de esto. Como señala @Braiam, dado que usted está definiendo el nombre de la variable en primer lugar, siempre lo sabrá y siempre podrá imprimirlo. ¿Qué estás intentando hacer realmente?
terdon
3
Creo que te has perdido la deriva de la solución SO; pruebavar=Test; Test=SO; echo ${!var}
iruvar
Yo tampoco lo entiendo, pero ¿qué es lo que intentas hacer? echo '$ var'
Renan Vicente
Tengo mucha curiosidad, ¡dinos para qué lo necesitabas!
bubakazouba

Respuestas:

22

La expansión del parámetro de shell $ {! Name @} o $ {! Name *} podría hacer el truco,

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar

Aunque sea factible, no puedo imaginar la utilidad de esto ...

xae
fuente
2
Tenga en cuenta que si foono está definido, pero lo foobares, obtendrá foobar. Otras alternativas: var_name=${-+foo}(o ${foo+foo}), var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas
1
Si hubiera dos variables visibles, foo y foobar, ambas definidas, la expresión ${!foo@}se evaluaría como foo foobar. Como señala la respuesta, su utilidad es difícil de imaginar.
CppNoob
30

Si desea simplemente generar un nombre de variable estática, puede escapar del $signo -s:

echo \$var
mjturner
fuente
3
Esta debería ser la solución aceptada.
David Poxon
9
¡No en absoluto! Esta respuesta no es una buena solución. Esto simplemente dará salida $var, pero es inútil si el nombre de la variable es dinámico. Por ejemplo, supongamos que necesita filtrar un conjunto de variables de entorno que comienzan con a PREFIX_, pero no conoce el tamaño del conjunto o los nombres de las variables que contiene. La solución aceptada es más adecuada para este escenario.
Héctor Valverde Pareja
aka var_name = "$ (echo \ $ var)"
Yordan Georgiev