2012-04-25 13 views
8

Sto graffiando la mia testa su questo, non riesco a trovare il riferimento bash a parlarne.

Nel codice qui sotto

host_color=${uphost}_host_color 
host_color=${!host_color} 

Qual è la seconda linea facendo? cosa fa l'operatore! in questo caso?

risposta

6

Questo è un modulo breve per indirect references.

$ foo=bar 
$ bar=bas 
$ echo ${!foo} 
bas 

La costruzione apparentemente simile ${!foo*} espande per i nomi di tutte le variabili il cui nome inizia con foo:

$ foo1=x 
$ foo2=y 
$ echo ${!foo*} 
foo1 foo2 
+0

Hai capito, grazie. Ora ha senso, host_color = verde, il verde è un'altra variabile con il codice colore. –

+0

+1 Sembra essere ciò che @ sta facendo il codice di Oliver - fondamentalmente impostando 'host_color' sul valore di' $ {uphost} _host_color'. Non è diverso dal settaggio di '$ {$ {stemost} _host_color}', giusto? –

1

Dal b ash manual: (!)

Se il primo carattere di parametro è un punto esclamativo, si introduce un livello di riferimento indiretto variabile . Bash utilizza il valore di la 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é nel valore del parametro stesso. Questo è noto come espansione indiretta. Le eccezioni a questo sono le espansioni di $ {! Prefix *} e $ {! Name [@]} descritte di seguito.

+1

è $ lo stesso di $ {prefix *!} {Prefix!}? –

+0

Ho pensato che sarebbe stata la prossima voce nella manpage dato che @ il post di Oliver non ha il "*" o "@": '$ {! Name [@]} -" Se ** name ** è un array variabile, si espande alla lista di indici di array (chiavi) assegnati nel nome.Se ** nome ** non è una matrice, si espande a 0 se ** nome ** è impostato. " –

+0

@Olivier: no, non sono la stessa cosa. Ho aggiunto i bit rilevanti dal manuale di bash. –

Problemi correlati