首页 > 解决方案 > 为什么我会收到错误“eval:在意外标记 `then' 附近出现语法错误”?重击

问题描述

在发帖之前,我已经做了很多研究,就像我一直做的那样......但我无法为我的生活弄清楚为什么我会收到这个错误......

./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}

标签: basheval

解决方案


当你运行时:

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;

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

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

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}

最后一点:您不需要所有的子外壳和评估:

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

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

所以

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}

推荐阅读