2012-05-25 32 views
26

mam zmienna $foo="something" i chciałby używać:Bash - zmienne zmienne

bar="foo"; echo $($bar) 

dostać "coś" echem.

+2

proszę zobaczyć [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). Ponadto nie powinieneś próbować używać znaku dolara po lewej stronie zadania. –

Odpowiedz

51

W bashu można użyć zmiennej $ {! Zmienna} do użycia zmiennych zmiennych.

foo="something" 
bar="foo" 
echo "${!bar}" 
+0

Znacznie lepiej niż moja odpowiedź. – mkb

+0

@mkb Nie wiedziałem eval :-) – dAm2K

+0

w 'sh' mówi złe podstawienie. Każdy pomysł, jak to zrobić w 'sh'? –

5

eval echo \"\$$bar\" zrobi to.

+5

Uważaj na [implikacje związane z bezpieczeństwem 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –

+0

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 \") ' '' –

6

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.

+0

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

+0

@ 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

0

Ż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}" 
Powiązane problemy