认为:
a=b; b=c; c=d
然后eval echo \$$a
产生输出:
c
d
如果我们想仅使用 input提取输出a
,我尝试了以下方法:
(i)eval echo \$(eval echo \$$a)
产生错误:
syntax error near unexpected token '('
(ii)eval echo \$\(eval echo \$$a\)
产生输出:
c
我无法理解为什么转义削减括号消除了错误。
另外,有人可以解释一下为什么我没有得到d
第二个实例中的输出吗?
答案1
首先,请注意:
从安全的角度来看,使用它是一个非常糟糕的eval
主意任何shell脚本除非你知道确切地你在做什么。 (即使如此,它实际上是最佳解决方案的实例几乎为零。)作为 shell 脚本编写的初学者,请忘记eval
Even 的存在。
如需进一步阅读,请参阅Eval 命令和安全问题。
要获得输出d
,您可以使用:
eval echo \$${!a}
或者:
eval eval echo \\\$\$$a
你出错的地方是将未转义的括号字符传递给echo
.如果它们前面有一个不带引号的$
,则为命令替换。但如果$
被引用并且不是括号中,它不是有效的 shell 语法。
答案2
嵌套评估是一件混乱的事情。
第一的,
eval echo \$\(eval echo \$$a\)
使解释器评估以下内容:
echo $(eval echo $b)
插入最里面的嵌套命令(即$(eval echo $b)
)会导致:
echo c
结果如下:
c
如果您希望正确评估嵌套的评估(我强烈推荐不是用来eval
根本不),你一定变得很奇怪。请参阅其他答案的示例。