Bash 中的“eval”命令及其典型用途

新手上路,请多包涵

在阅读了 Bash 手册页这篇文章之后,我仍然无法理解 eval 命令的具体用途以及它的典型用途。

例如,如果我们这样做:

 $ set -- one two three  # Sets $1 $2 $3
$ echo $1
one

$ n=1
$ echo ${$n}       ## First attempt to echo $1 using brackets fails
bash: ${$n}: bad substitution

$ echo $($n)       ## Second attempt to echo $1 using parentheses fails
bash: 1: command not found

$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeeds
one

这里到底发生了什么,美元符号和反斜杠如何与问题联系起来?

原文由 stratis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 973
2 个回答

eval 将字符串作为其参数,并对其进行评估,就好像您在命令行上键入了该字符串一样。 (如果你传递了几个参数,它们首先用它们之间的空格连接起来。)

${$n} 是 bash 中的语法错误。在大括号内,你只能有一个变量名,带有一些可能的前缀和后缀,但你不能有任意的 bash 语法,特别是你不能使用变量扩展。不过,有一种说法是“名称在此变量中的变量的值”:

 echo ${!n}
one

$(…) 在子shell 中运行括号内指定的命令(即在从当前shell 继承所有设置(例如变量值)的单独进程中),并收集其输出。所以 echo $($n) 运行 $n 作为 shell 命令,并显示其输出。由于 $n 计算结果为 1 , $($n) 尝试运行命令 1 不存在 81781641

eval echo \${$n} 运行传递给 eval 的参数。展开后参数为 echo${1} 。所以 eval echo \${$n} 运行命令 echo ${1}

请注意,大多数情况下,您必须在变量替换和命令替换周围使用双引号(即,只要有 $ ): "$foo", "$(foo)"总是在变量和命令替换周围加上双引号,除非你知道你需要把它们去掉。如果没有双引号,shell 会执行字段拆分(即,它将变量的值或命令的输出拆分为单独的单词),然后将每个单词视为通配符模式。例如:

 $ ls
file1 file2 otherfile
$ set -- 'f* *'
$ echo "$1"
f* *
$ echo $1
file1 file2 file1 file2 otherfile
$ n=1
$ eval echo \${$n}
file1 file2 file1 file2 otherfile
$eval echo \"\${$n}\"
f* *
$ echo "${!n}"
f* *

eval 不经常使用。在某些 shell 中,最常见的用途是获取名称直到运行时才知道的变量的值。在 bash 中,由于 ${!VAR} 语法,这不是必需的。 eval 当您需要构造一个包含运算符、保留字等的较长命令时仍然很有用。

原文由 Gilles ‘SO- stop being evil’ 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单地将 eval 视为“在执行前再评估一次表达式”

eval echo \${$n} —在第一轮评估后变成 echo $1 。需要注意的三个变化:

  • The \$ became $ (The backslash is needed, otherwise it tries to evaluate ${$n} , which means a variable named {$n} , which is不允许)
  • $n 被评估为 1
  • eval 消失了

第二轮基本是 echo $1 可以直接执行。

所以 eval <some command> 将首先评估 <some command> (这里的评估是指替换变量,用正确的字符替换转义字符等),然后再次运行结果表达式。

eval 当您想要动态创建变量或从专门设计为这样读取的程序中读取输出时使用。有关示例,请参阅 _Eval 命令和安全问题_。该链接还包含一些使用 eval 的典型方式,以及与之相关的风险。

原文由 Hari Menon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题