bash - 为什么我会收到错误“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}
解决方案
当你运行时:
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}
推荐阅读
- yii2 - Yii2 搜索模型
- c# - 在 ASP.NET MVC 中显示和搜索特定记录
- python - unindent 不匹配任何外部缩进级别。当我要标记字符串时
- ios - MobileVLCKit 视频全屏
- php - 如何通过多页使用php将pdf文件插入数据库?
- php - 定期检查从 Laravel 中的 3rd 方应用程序发布的数据
- shader - 为什么 Unreal 材质中的饱和在现代图形硬件中被认为是免费的
- json - 使用 reactjs 和 redux 在多个组件中获取 JSON 数据
- python - cx_Freeze:pytesseract 的可执行文件在其他 PC 上失败
- vue.js - 如何使用 axiosjs 从这样的数组中获取数据