Estoy leyendo " Guía de Bash para principiantes ". Dice:
Si el primer carácter de
PARAMETER
es un signo de exclamación, Bash usa el valor de la variable formada a partir del resto dePARAMETER
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 dePARAMETER
sí mismo. Esto se conoce como expansión indirecta.
El ejemplo dado es:
franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
No entiendo bien aquí:
el valor de la variable formada por el resto de
PARAMETER
Como PARAMETER
es justo !N*
, entonces
el resto de
PARAMETER
es justo N*
. ¿Cómo podría esto formar una variable? ¿Bash buscó todos los comandos posibles allí?
fuente
Parece haber una excepción cuando la "indirección" dada termina en a
*
, como ocurre aquí. En este caso, da todos los nombres de variables que comienzan con la parte que especificó (N
aquí). Bash puede hacer eso porque rastrea las variables y sabe cuáles existen.La verdadera indirección es la siguiente:
digamos que tengo una variable
$VARIABLE
establecida en42
y tengo otra variable$NAME
establecida enVARIABLE
.${!NAME}
me dará42
. Utiliza el valor de una variable para decirle el nombre de otra:$ NAME="VARIABLE" $ VARIABLE=42 $ echo ${!NAME} 42
fuente
Sí, busca todas las posibles expansiones de variables después de!. Si lo hubiera hecho:
echo ${!NP*}
solo obtendrías
NPX_PLUGIN_PATH
.Considere el siguiente ejemplo:
:~> export myVar="hi" :~> echo ${!my*} myVar :~> export ${!my*}="bye" :~> echo $myVar bye
fuente
${!my*}
expande a myA, myB, myA se exporta con su valor actual y myB se establece en "bye" y se exporta. No es muy útil.Ha encontrado una excepción en el procesamiento indirecto, donde si el último carácter es
*
, se devolverán todas las variables que tienen el prefijo dado antes.fuente
*
caso, ¿es esto lo mismo que${${VAR}}
?${${VAR}}
más brevemente escribible como${$VAR}
, no es legal, ya que$VAR
devuelve una cadena, que no puede seguir el$
signo; para usar una cadena como nombre de variable, debe introducir un nivel de direccionamiento indirecto (como se cita en la pregunta original), es decir , puede usar${!VAR}
, que hace exactamente lo que esperaría (errónea pero comprensiblemente)${$VAR}
.Puede consultar este documento GNU para bash para obtener información autorizada
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion
Pero básicamente, la expansión indirecta no se realiza en
${!prefix*}
como una de las excepciones, en su ejemplo, N es el prefijo.El documento explicará qué es la expansión indirecta en bash
fuente