2012-04-25 21 views
8

Me estoy rascando la cabeza en este caso, no puedo encontrar la referencia bash hablando de ello.

En el siguiente código

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

Lo que está haciendo la segunda línea? ¿Qué hace el operador! en este caso?

Respuesta

6

Esa es una forma abreviada de indirect references.

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

La construcción aparentemente similares ${!foo*} expande a los nombres de todas las variables cuyo nombre empiezan con foo:

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

Lo tienes, gracias. Ahora tiene todo el sentido, host_color = verde, verde es otra variable con el código de color. –

+0

+1 Parece ser lo que está haciendo el código @ Oliver, básicamente estableciendo 'host_color' en el valor de' $ {uphost} _host_color'. No es diferente de establecerlo en '$ {$ {uphost} _host_color}', ¿verdad? –

1

de la B ash manual: (!)

Si el primer carácter del parámetro es un signo de exclamación, se introduce un nivel de indirección variables . Bash usa el valor de la variable formada a partir del resto del parámetro como el nombre de la variable ; esta variable luego se expande y ese valor se usa en el resto de la sustitución, en lugar del valor del parámetro en sí. Esto se conoce como expansión indirecta. Las excepciones a esto son las expansiones de $ {! Prefix *} y $ {! Name [@]} que se describen a continuación.

+1

es lo mismo que $ $ {prefijo *!} {Prefijo!}? –

+0

Pensé que sería la siguiente entrada en la página de manual ya que la publicación de @ Oliver no tiene el "*" o "@": '$ {! Nombre [@]}' - "Si ** nombre ** es una matriz variable, se expande a la lista de índices de matriz (claves) asignados en el nombre. Si ** name ** no es una matriz, se expande a 0 si se establece ** name **. –

+0

@Olivier: no, no son lo mismo. He agregado los bits relevantes del manual bash. –

Cuestiones relacionadas