为什么我收到错误 "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}
最后一点:你不需要所有的 subshells 和 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
,以及扩展后出现的所有参数,必须来自您自己创建的内容或可信来源。
我在发帖之前做了很多研究,一如既往...但我无法弄清楚为什么会出现此错误...
./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}
最后一点:你不需要所有的 subshells 和 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
,以及扩展后出现的所有参数,必须来自您自己创建的内容或可信来源。