我刚刚提到了bash的间接引用${!t}
的简短表示法。我曾经\$$t
之前的eval
种间接引用。但是,使用${!t}
表示法似乎我不需要这样做:
# d=e e=f; eval y=${!d}; echo $y
f
# d=e e=f; y=${!d}; echo $y
f
为什么我们这里不需要评估?它被隐含地称为吗?
答案 0 :(得分:2)
来自Bash参考手册的3.5.3 Shell Parameter Expansion部分:
如果参数的第一个字符是感叹号(!),它会引入一个变量间接的级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值。这被称为间接扩张。例外情况是下面描述的$ {!prefix *}和$ {!name [@]}的扩展。感叹号必须紧跟左括号以引入间接。
间接的eval \$$t
版本手动导致对行内容的两次评估。第一个获取间接变量名称,第二个获取其值。