Załóżmy, że mam zmienną var
w bash. Mogę przypisać mu wartość. Na przykład zrobię z tego ciąg:
var="Test"
Chcę echo
nazwy 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 .
echo var
?var=Test; Test=SO; echo ${!var}
Odpowiedzi:
Rozszerzenie parametru powłoki $ {! Name @} lub $ {! Name *} może załatwić sprawę,
Chociaż jest to wykonalne, nie wyobrażam sobie przydatności tego ...
źródło
foo
nie jest zdefiniowane, alefoobar
jest, otrzymaszfoobar
. Inne alternatywy:var_name=${-+foo}
(lub${foo+foo}
)var_name=$'foo'
,var_name=$"foo"
:-)${!foo@}
oceniałoby nafoo foobar
. Jak zauważa odpowiedź, trudno wyobrazić sobie jej użyteczność.Jeśli chcesz po prostu wypisać nazwę zmiennej statycznej, możesz uciec od
$
znaku -sign:źródło
$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 aPREFIX_
, ale nie wiesz o wielkości zestawu lub zawartych w nim nazwach zmiennych. Przyjęte rozwiązanie jest bardziej odpowiednie dla tego scenariusza.