使用 eval 命令两次

使用 eval 命令两次

认为:

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 脚本编写的初学者,请忘记evalEven 的存在。

如需进一步阅读,请参阅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根本不),你一定变得很奇怪。请参阅其他答案的示例。

答案3

d您可以通过以下方式获得预期的输出:

eval echo \$$(echo ${!a})

${!a}是 bash 变量名扩展,它提供c你的值。请参阅bash手册

相关内容