2011-12-15 10 views
40

Przeczytam "Przewodnik po Bash dla początkujących". Mówi:

Jeśli pierwszy znak PARAMETER jest wykrzyknik, Bash używa wartości zmiennej utworzonej z reszty PARAMETER jako nazwę zmiennej; zmienna ta jest następnie rozwijana i ta wartość jest używana w pozostałej części podstawienia, a nie samej wartości PARAMETER. Jest to znane jako pośrednia ekspansja.

podanym przykładzie jest:

franky ~> echo ${!N*} 
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH 

ja nie bardzo rozumiem tutaj:

wartość zmiennej utworzonej z reszty PARAMETER

Jako PARAMETER tylko !N*, następnie

reszta PARAMETER

tylko N*. Jak to może stworzyć zmienną? Czy Bash przeszukał tam wszystkie możliwe polecenia?

Odpowiedz

56

Jeśli czytasz stronę bash mężczyzna, to w zasadzie potwierdza to, co już powiedział:

Jeżeli pierwszym znakiem parametru jest wykrzyknik (!), poziom zmiennej zadnie wprowadza. Bash używa wartości zmiennej utworzonej z reszty parametru jako nazwy zmiennej; zmienna ta jest następnie rozwijana, a ta wartość jest używana w pozostałej części podstawienia, a nie w wartości samego parametru. Jest to znane jako pośrednia ekspansja.

Jednak czytając stamtąd:

Wyjątki od tego są ekspansje ${!prefix*} i ${!name[@]} opisane poniżej.

${!prefix*} Nazwy pasujące do prefiksu.Rozwija się do nazw zmiennych, których nazwy zaczynają się od prefiksu, oddzielone pierwszym znakiem specjalnej zmiennej IFS.

Innymi słowy, Szczególnym przykładem ${!N*} jest wyjątek do reguły, którą cytowany. To robi, działają jak reklamowane w oczekiwanych przypadkach, takich jak jednakże:

$ export xyzzy=plugh ; export plugh=cave 

$ echo ${xyzzy} # normal, xyzzy to plugh 
plugh 

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave 
cave 
1

Tak, wyszukuje wszystkie możliwe ekspansje zmiennych po!. Jeśli zrobiłeś:

echo ${!NP*} 

dostaniesz tylko NPX_PLUGIN_PATH.

Rozważmy następujący przykład:

:~> export myVar="hi" 
:~> echo ${!my*} 
    myVar 
:~> export ${!my*}="bye" 
:~> echo $myVar 
    bye 
+0

Czy inne zmienne, które pasują do mojego *, również będą ustawione na "bye"? – Anthony

+0

@Anthony Próbowałem go i jeśli '$ {! My *}' rozszerza się na myA, myB, mojaA jest eksportowana z bieżącą wartością, a mojaB jest ustawiona na "bye" i eksportowana. Niezbyt przydatne. – GKFX

1

pan uderzyć wyjątek w przetwarzaniu zadnie, gdzie jeżeli ostatnia postać jest * wszystkie zmienne, które mają prefiks podany przed będą zwracane.

+0

Więc poza przypadkiem '*' jest to to samo co '$ {$ {VAR}}'? – chronospoon

13

Nie wydaje się być wyjątkiem, gdy dany „droga pośrednia” kończy się *, jak ma to miejsce tutaj. W tym przypadku podaje wszystkie nazwy zmiennych zaczynające się od podanej części (N). Bash może to zrobić, ponieważ śledzi zmienne i wie, które z nich istnieją.

prawda wskazanie pośrednie to:
Say mam zmienną $VARIABLE zestaw do 42 i mam innej zmiennej $NAME zestaw do VARIABLE. ${!NAME} da mi 42. Używasz wartości jednej zmiennej, aby podać nazwę innej:

$ NAME="VARIABLE" 
$ VARIABLE=42 
$ echo ${!NAME} 
42 
+0

Wow, kto wiedział, że tak łatwo było uzyskać odpowiedź na sens życia, wszechświata i wszystkiego! – KomodoDave

+0

@KomodoDave Teraz, jeśli tylko znaliśmy to pytanie .. – Dan