为什么我收到错误 "eval: syntax error near unexpected token `then'"? BASH

Why am i getting error "eval: syntax error near unexpected token `then'"? BASH

我在发帖之前做了很多研究,一如既往...但我无法弄清楚为什么会出现此错误...

./test.sh: eval: line 4: syntax error near unexpected token `then'

STARTUP 是从另一个脚本导出的变量,因此我将其包含在此处用于测试目的。

sed 命令只是将字符串 {{COMMAND}} 转换为在此脚本之外定义的变量 ${COMMAND}

#!/bin/bash

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`

# run the script
${EVAL_SCRIPT}

当你运行:

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`

$(...) 被评估,我们最终得到:

EVAL_SCRIPT=`eval echo if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;`

然后执行反引号 - 这三个命令:

  • eval echo if [ -f entrypoint.sh ];
  • then {{COMMAND}};
  • fi;

第一个命令会 运行 找到并回显 if [ -f entrypoint.sh ]; 但是第二个命令无效,因为我们有一个没有前面的 if 的 then。这就是我们收到错误的原因。

因此,如果我们以不同的方式引用它:

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=`eval echo \"$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')\"`

我们得到了我们想要分配给 EVAL_SCRIPT 的东西:if [ -f entrypoint.sh ]; then ${COMMAND}; fi;

只剩一件事了。您不能仅使用以下命令执行变量:

# run the script
${EVAL_SCRIPT}

您需要评估一个变量。所以你需要:

# run the script
eval ${EVAL_SCRIPT}

最后一点:你不需要所有的 subshel​​ls 和 evals:

  • `eval echo "..."` 是完全多余的:eval 执行 echo 命令,这完全等同于 `echo "..."`

  • `echo "..."` 是完全多余的:回显被执行,这完全等同于 ...

所以

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=`eval echo $(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')`

等同于:

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')

最后,效果很好:

#!/bin/bash

STARTUP="if [ -f entrypoint.sh ]; then {{COMMAND}}; fi;"
EVAL_SCRIPT=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')

# run the script
eval ${EVAL_SCRIPT}

您正在使用多余的间接寻址和子 shell。您的代码片段可以缩减为

#!/bin/bash

startup=${STARTUP//'{{'/'${'}
eval "${startup//'}}'/'}'}"

当然,eval 必须仅用于您自己创建的或来自可信来源的内容。特别是这里的参数STARTUP,以及扩展后出现的所有参数,必须来自您自己创建的内容或可信来源。