什么是间接扩展? $ {!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。

    Interesting Posts