什么是间接扩展? $ {!var *}是什么意思?
我正在阅读“ Bash入门指南 ”。 它说:
如果
PARAMETER的第一个字符是感叹号,则Bash使用PARAMETER其余部分形成的variables的值作为variables的名称; 这个variables然后被展开,并且该值被用在其余的replace中,而不是PARAMETER本身的值。 这被称为间接扩张。
给出的例子是:
franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
我在这里不太明白:
由
PARAMETER的其余部分形成的variables的值
 因为PARAMETER就是!N* ,那么 
PARAMETER的其余部分
 只是N* 。 这怎么可能形成一个variables?  Bash在那里search所有可能的命令吗? 
 如果你阅读bash手册页,它基本上证实了你所说的: 
如果参数的第一个字符是感叹号(
!),则引入一个variables间接级别。 Bash使用由其余参数形成的variables的值作为variables的名称; 这个variables然后被展开,并且该值被用在其余的replace中,而不是参数本身的值。 这被称为间接扩张。
但是,从那里读:
例外情况是下面描述的
${!prefix*}和${!name[@]}的扩展。
${!prefix*}名称匹配前缀。 扩展为名称以前缀开头的variables的名称,由IFS特殊variables的第一个字符分隔。
 换句话说,您特定的示例${!N*}是您引用的规则的一个例外 。 但是,它的确如预期的情况下所宣传的那样工作,例如: 
 $ export xyzzy=plugh ; export plugh=cave $ echo ${xyzzy} # normal, xyzzy to plugh plugh $ echo ${!xyzzy} # indirection, xyzzy to plugh to cave cave 
 当给定的“间接”以*结尾时,似乎有一个例外,就像这里所做的那样。 在这种情况下,它会提供所有以您指定的部分(此处为N )开始的variables名称。  Bash可以这样做,因为它追踪variables并知道哪些variables存在。 
 真正的间接是这样的: 
 说我有一个variables$VARIABLE设置为42 ,我有另一个variables$NAME设置为VARIABLE 。  ${!NAME}会给我42 。 你用一个variables的值来告诉你另一个variables的名字: 
 $ NAME="VARIABLE" $ VARIABLE=42 $ echo ${!NAME} 42 
是的,它会在!之后search所有可能的variables扩展。 如果你做了:
 echo ${!NP*} 
 你只会得到NPX_PLUGIN_PATH 。 
考虑下面的例子:
 :~> export myVar="hi" :~> echo ${!my*} myVar :~> export ${!my*}="bye" :~> echo $myVar bye 
 你在间接处理中遇到了一个exception,如果最后一个字符是* ,那么将会返回所有前面给出的前缀的variables。