W bash, jak mogę powtórzyć nazwę zmiennej, a nie jej wartość? [Zamknięte]

18

Załóżmy, że mam zmienną varw bash. Mogę przypisać mu wartość. Na przykład zrobię z tego ciąg:

var="Test"

Chcę echonazwy var, a nie wartości posiadanej przez var. (Mogę zrobić to drugie echo $var, ale tak naprawdę chcę zrobić to pierwsze.)

Odpowiedź na to pytanie z SO mówi, aby użyć echo ${!var}, ale kiedy to zrobię, echo po prostu zwraca pustą linię. Na przykład ten skrypt bash

#!/bin/bash

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

zwraca ten wynik:

Hi

Bye

z pustą linią między Cześć a Cześć , zamiast var . Co ja robię źle?

Korzystam z wersji bash 4.1.5 (1) na Ubuntu 10.04.4 .

Andrzej
źródło
11
Err ... tylko echo var?
Braiam
5
Naprawdę nie rozumiem o co chodzi. Jak wskazuje @Braiam, ponieważ w pierwszej kolejności definiujesz nazwę zmiennej, zawsze będziesz ją znać i zawsze będziesz mógł ją wydrukować. Co tak naprawdę próbujesz zrobić?
terdon
3
Myślę, że przegapiłeś dryf rozwiązania SO; spróbujvar=Test; Test=SO; echo ${!var}
iruvar
Ja też tego nie rozumiem, ale to właśnie próbujesz zrobić? echo „$ var”
Renan Vicente
Jestem naprawdę ciekawy, powiedz nam, do czego go potrzebujesz!
bubakazouba

Odpowiedzi:

22

Rozszerzenie parametru powłoki $ {! Name @} lub $ {! Name *} może załatwić sprawę,

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

Chociaż jest to wykonalne, nie wyobrażam sobie przydatności tego ...

xae
źródło
2
Pamiętaj, że jeśli foonie jest zdefiniowane, ale foobarjest, otrzymasz foobar. Inne alternatywy: var_name=${-+foo}(lub ${foo+foo}) var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas
1
Gdyby były widoczne dwie zmienne, foo i foobar, obie zdefiniowane, wyrażenie ${!foo@}oceniałoby na foo foobar. Jak zauważa odpowiedź, trudno wyobrazić sobie jej użyteczność.
CppNoob
30

Jeśli chcesz po prostu wypisać nazwę zmiennej statycznej, możesz uciec od $znaku -sign:

echo \$var
mjturner
źródło
3
To powinno być przyjęte rozwiązanie.
David Poxon,
9
Nie w al !! Ta odpowiedź nie jest dobrym rozwiązaniem. Zostanie po prostu wyprowadzony $var, ale jest bezużyteczny, jeśli nazwa zmiennej jest dynamiczna. Na przykład załóżmy, że musisz odfiltrować zestaw zmiennych środowiskowych zaczynających się od a PREFIX_, ale nie wiesz o wielkości zestawu lub zawartych w nim nazwach zmiennych. Przyjęte rozwiązanie jest bardziej odpowiednie dla tego scenariusza.
Héctor Valverde Pareja
aka var_name = "$ (echo \ $ var)"
Yordan Georgiev