2011-12-15 15 views
40

Sto leggendo "Bash Guide per principianti". Si dice:

Se il primo carattere di PARAMETER è un punto esclamativo, Bash utilizza il valore della variabile formata dal resto PARAMETER come nome della variabile; questa variabile viene quindi espansa e tale valore viene utilizzato nel resto della sostituzione, anziché il valore di PARAMETER stesso. Questo è noto come espansione indiretta.

L'esempio fornito è:

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

non capisco qui:

il valore della variabile formata dal resto PARAMETER

Come la PARAMETER è solo !N*, quindi

il resto della PARAMETER

è solo N*. Come potrebbe formare una variabile? Bash cercava qui tutti i comandi possibili?

risposta

56

Se leggete la pagina di bash uomo, conferma in pratica quello che hai detto:

Se il primo carattere del parametro è un punto esclamativo (!), viene introdotto un livello di indirezione variabile. Bash utilizza il valore della variabile formata dal resto del parametro come nome della variabile; questa variabile viene quindi espansa e tale valore viene utilizzato nel resto della sostituzione, anziché il valore del parametro stesso. Questo è noto come espansione indiretta.

Tuttavia, la lettura da lì:

Le eccezioni a questa sono le espansioni di ${!prefix*} e ${!name[@]} descritte di seguito.

${!prefix*} Nomi corrispondenti prefisso.Espande i nomi delle variabili i cui nomi iniziano con il prefisso, separati dal primo carattere della variabile speciale IFS.

In altre parole, il tuo esempio particolare ${!N*} è un un'eccezione alla regola che hai citato. Si fa , tuttavia, il lavoro come pubblicizzato nei casi previsti, come ad esempio:

$ export xyzzy=plugh ; export plugh=cave 

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

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

Sì, cerca tutte le possibili espansioni di variabili dopo! Se tu avessi fatto:

echo ${!NP*} 

si otterrebbe solo NPX_PLUGIN_PATH.

consideri il seguente esempio:

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

altre variabili che corrispondono alla mia * anche essere impostato su "ciao"? – Anthony

+0

@Anthony L'ho provato, e se '$ {! My *}' si espande in myA, myB, myA viene esportato con il suo valore corrente e myB è impostato su "ciao" ed esportato. Non molto utile. – GKFX

1

Hai colpito un'eccezione nella lavorazione indiretto, in cui, se l'ultimo carattere è *, tutte le variabili che hanno il prefisso dato prima saranno restituiti.

+0

Quindi a parte il caso '*', è uguale a '$ {$ {VAR}}'? – chronospoon

13

Sembra che ci sia un'eccezione quando il dato "indiretto" si conclude in un *, come fa qui. In questo caso, fornisce tutti i nomi delle variabili che iniziano con la parte specificata (N qui). Bash può farlo perché tiene traccia delle variabili e sa quali esistono.

vero indirezione è questo:
dire che ho un $VARIABLE variabile impostata a 42, e ho un'altra variabile $NAME insieme a VARIABLE. ${!NAME} mi darà 42. Si utilizza il valore di una variabile per dirvi il nome di un'altra:

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

Wow, chi sapeva che era così facile ottenere la risposta al significato della vita, dell'universo e di tutto! – KomodoDave

+0

@KomodoDave Ora se solo sapessimo la domanda .. – Dan