我刚想到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
版本是手动导致对行内容进行两次评估的。第一个获取间接变量名,第二个获取其值。