为了账号安全,请及时绑定邮箱和手机立即绑定

什么是间接扩张?${!var*}是什么意思?

什么是间接扩张?${!var*}是什么意思?

森栏 2019-07-02 17:14:12
什么是间接扩张?${!var*}是什么意思?我在读“初学者指南“.上面写着:如果第一个字符PARAMETER是一个感叹号,Bash使用从PARAMETER作为变量的名称;然后展开该变量,该值用于替换的其余部分,而不是PARAMETER本身。这就是所谓的间接膨胀。举的例子如下:franky ~> echo ${!N*}NNTPPORT NNTPSERVER NPX_PLUGIN_PATH我不太明白:的其余部分形成的变量的值。PARAMETER就像PARAMETER只是!N*,然后其余部分PARAMETER只是N*..这怎么能形成一个变量呢?巴什在那里搜索了所有可能的命令吗?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果你读到bash手册页,它基本上证实了您的声明:

如果参数的第一个字符是感叹号(!),引入了一个变量间接级别。Bash使用参数其余部分形成的变量的值作为变量的名称;然后展开该变量,该值用于替换的其余部分,而不是参数本身的值。这就是所谓的间接膨胀。

然而,从这一点来看:

这方面的例外是${!prefix*}${!name[@]}如下所述。

${!prefix*}名称匹配前缀。展开为以前缀开头的变量的名称,以IFS特殊变量。

换句话说,您的特定示例${!N*}例外你引用的规则。它是吗?然而,在预期情况下公布的工作,例如:

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plughplugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cavecave


查看完整回答
反对 回复 2019-07-02
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

当给定的“间接”以*就像这里一样。在本例中,它给出了以指定的部分开头的所有变量名(N在这里)。Bash之所以能做到这一点,是因为它跟踪变量并知道哪些变量存在。

真正的间接是:
假设我有一个变量$VARIABLE设为42,我还有另一个变量$NAME设为VARIABLE${!NAME}会给我42..您可以使用一个变量的值来告诉您另一个变量的名称:

$ NAME="VARIABLE"

$ VARIABLE=42

$ echo ${!NAME}

42


查看完整回答
反对 回复 2019-07-02
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

之后搜索所有可能的变量展开。如果你做了:

echo ${!NP*}

你只会得到NPX_PLUGIN_PATH.

考虑以下示例:

:~> export myVar="hi":~> echo ${!my*}
    myVar:~> export ${!my*}="bye":~> echo $myVar
    bye


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 1295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信