Estoy leyendo " Guía de Bash para principiantes ". Dice:
Si el primer carácter de
PARAMETERes un signo de exclamación, Bash usa el valor de la variable formada a partir del resto dePARAMETERcomo 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 dePARAMETERsí 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 PARAMETERes 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ó (Naquí). 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
$VARIABLEestablecida en42y tengo otra variable$NAMEestablecida enVARIABLE.${!NAME}me dará42. Utiliza el valor de una variable para decirle el nombre de otra:$ NAME="VARIABLE" $ VARIABLE=42 $ echo ${!NAME} 42fuente
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 byefuente
${!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$VARdevuelve 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