mam zmienna $foo="something"
i chciałby używać:Bash - zmienne zmienne
bar="foo"; echo $($bar)
dostać "coś" echem.
mam zmienna $foo="something"
i chciałby używać:Bash - zmienne zmienne
bar="foo"; echo $($bar)
dostać "coś" echem.
eval echo \"\$$bar\"
zrobi to.
Uważaj na [implikacje związane z bezpieczeństwem 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –
To rozwiązanie ma tę zaletę, że jest kompatybilne z POSIX dla powłok innych niż powłoki Bash (na przykład w środowiskach lekkich, takich jak systemy wbudowane lub kontenery Docker). I można przypisać wartość innej zmiennej tak: '' 'sh var = $ (eval echo \ "\ $$ bar \") ' '' –
Przyjęta odpowiedź jest wspaniała. Jednak @Edison zapytał, jak zrobić to samo dla tablic. Sztuczka polega na tym, że chcesz, aby twoja zmienna trzymała "[@]", aby tablica została rozszerzona o "!". Sprawdź tę funkcję, aby zrzucić zmienne:
$ function dump_variables() {
for var in "[email protected]"; do
echo "$var=${!var}"
done
}
$ STRING="Hello World"
$ ARRAY=("ab" "cd")
$ dump_variables STRING ARRAY ARRAY[@]
This wyjścia:
STRING=Hello World
ARRAY=ab
ARRAY[@]=ab cd
Kiedy podaje się tylko ARRAY
, pierwszy element jest pokazany jako, że to, co się rozszerzony przez !
. Podając format ARRAY[@]
, otrzymujesz tablicę i wszystkie jej wartości rozszerzone.
Dobra rada dotycząca obsługi tablic. Masz pomysł, jak zdobyć * indeksy * tablicy? Instrukcja [manual] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) wskazuje, że normalnie robi się to za pomocą '$ {! ARRAY [@]}', co wydaje się do konfliktu ze zmienną składnią indirect. – dimo414
@ dimo414 Tak, uzyskanie kluczy w kierunku pośrednim jest trudniejsze. Musiałbyś podać tylko nazwę, a następnie rozwinąć metodę: 'local -a 'keys = (" $ {!' "$ Var" '[@]} ")" '. Artykuł na temat Bash Hackers (http://wiki.bash-hackers.org/syntax/arrays#indirection) jest bardziej szczegółowy. – bishop
Żeby było jasne, jak to zrobić z tablicami:
arr=('a' 'b' 'c')
# construct a var assigning the string representation
# of the variable (array) as its value:
var=arr[@]
echo "${!var}"
proszę zobaczyć [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). Ponadto nie powinieneś próbować używać znaku dolara po lewej stronie zadania. –