Załóżmy, że zadeklarowałem następujące zmienne:
$ var='$test'
$ test="my string"
Jeśli wydrukuję ich zawartość, zobaczę:
$ echo $var
$test
$ echo $test
my string
Chciałbym znaleźć sposób na wydrukowanie zawartości treści $var
(która jest zawartością $test
). Próbowałem więc wykonać następujące czynności:
$ echo $(echo $var)
$test
Ale tutaj wynik jest $test
i nie "my string"
... Czy można wydrukować zawartość zmiennych za pomocą bash?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
źródło
źródło
ash
, lubbash
, lubcsh
, lubdash
, ...zsh
, lub POSIXsh
, czy potrzebujesz pracy w różnych systemach?Odpowiedzi:
Możesz to zrobić za pomocą pośredniego rozszerzenia zmiennych bash (pod warunkiem, że możesz pominąć
$
zmienną referencyjną):3.5.3 Rozszerzenie parametru powłoki
źródło
W przypadku, gdy nazwa zmiennej zawarta
var
jest w prefiksie$
, możesz użyćeval
:Co się tutaj stało:
$var
się do wartości$test
, tworząceval echo $test
polecenie;eval
oceniaecho $test
wyrażenie i daje pożądany wynik.Pamiętaj, że używanie
eval
ogólnie może być niebezpieczne (w zależności od tego, co jest przechowywanevar
), więc wolisz go unikać. Funkcja rozszerzenia pośredniego jest lepsza w twoim przypadku (ale musisz pozbyć się$
logowania$test
).źródło
eval
, trzeba dwóch warstw podwójnych cudzysłowach, linia to:eval echo "\"$var\""
. Pamiętaj, że to nie ma wpływu na inne niebezpieczeństwa związane z używaniemeval
, o których wspomniałeś.Podobne do odpowiedzi Jesse_b , ale przy użyciu zmiennej odwołania do nazwy zamiast pośredniej zmiennej (wymaga wersji
bash
4.3+):Zmienna odwołania
var
do nazwy zawiera nazwę zmiennej, do której się odwołuje. Gdy zmienna zostanie odwołana jako$var
, zwracana jest wartość tej innej zmiennej.bash
rozwiązuje rekurencyjne odwołania do nazw:Aby uzyskać kompletność, użycie tablicy asocjacyjnej (w wersji
bash
4.0+) jest również jednym ze sposobów rozwiązania tego problemu, w zależności od wymagań:Zapewnia to bardziej elastyczny sposób uzyskiwania dostępu do więcej niż jednej wartości za pomocą klucza lub nazwy, które mogą być określane dynamicznie. Może to być preferowane, jeśli chcesz zebrać wszystkie wartości określonej kategorii w jednej tablicy, ale nadal możesz uzyskać do nich dostęp za pomocą jakiegoś klucza (np. Nazw dostępnych według identyfikatora lub ścieżek dostępnych według celu itp.), Ponieważ nie zanieczyszcza zmienna przestrzeń nazw skryptu.
źródło
Z
zsh
:Z każdą powłoką podobną do Bourne'a
Pamiętaj, że w tych powłokach zmienne rozszerzenia muszą być cytowane, aby zapobiec split + glob (
zsh
będącym wyjątkiem) iecho
nie mogą być używane do dowolnych danych.Ponieważ zarówno
(e)
ieval
jest powłoka ocena kod, ważne treść$var
utrzymać się w granicach kontroli, jak w inny sposób, który może być dowolną usterkę wtrysku poleceń (sam z${!var}
podejść).źródło