我刚想到bash间接引用的简短符号。我习惯用${!t}来代替\$$t的间接引用。但是,使用eval符号,我似乎不需要这样做:

# d=e e=f; eval y=${!d}; echo $y
f
# d=e e=f; y=${!d}; echo $y
f

为什么我们不需要评估?是隐式调用的吗?

最佳答案

根据Bash参考手册的3.5.3 Shell Parameter Expansion部分:
如果参数的第一个字符是感叹号(!),它引入了一个级别的变量间接寻址。Bash使用参数其余部分形成的变量值作为变量名;然后展开该变量,并在替换的其余部分使用该值,而不是参数本身的值。这就是所谓的间接扩张。例外的是${的扩展!前缀*}和${!名称[@]}如下所述。感叹号必须紧跟在左大括号后面才能引入间接寻址。
间接寻址的eval \$$t版本是手动导致对行内容进行两次评估的。第一个获取间接变量名,第二个获取其值。

09-04 18:04