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