Shell运行正常的脚本被cron调用时报[[: not found错误如何解决
Cron执行Shell脚本报
[[: not found错误解决方案 错误根因
[[ ]]是Bash专属的条件判断语法,Cron调度任务默认使用sh作为命令解析器,sh不支持该语法,因此执行到脚本第9行时抛出对应错误。- 你直接在终端执行脚本时,默认调用当前用户的登录Shell(通常为Bash),语法可被正常识别,因此运行无异常。
修复方案
方案1(最推荐):脚本头部指定Bash解析器
在脚本最顶部第一行添加Shebang声明,指定使用Bash解析执行,注意声明前不能留空行:
#!/bin/bash
也可使用兼容性更好的写法,自动从系统环境变量中查找Bash路径:
#!/usr/bin/env bash
修改后无需调整Cron配置,即可正常调度执行。
方案2:调整Cron配置指定全局解析器
如果不需要修改脚本内容,可以在当前用户的Crontab配置文件最开头添加如下声明,指定该用户所有Cron任务均使用Bash执行:
SHELL=/bin/bash
注意该配置会影响当前用户的所有Cron任务,若存在其他依赖sh语法的脚本则不建议使用。
方案3:修改脚本语法适配sh解析器
如果需要脚本兼容sh解析规则,可以将第9行的[[ ]]替换为sh原生支持的[ ]语法,调整后的判断逻辑如下:
if [ "$db" != "information_schema" ] && [ "${db:0:1}" != "_" ] && [ "$db" != "mysql" ] && [ "$db" != "performance_schema" ] ; then
该方案兼容性最高,但需要调整原有逻辑写法,容易出现语法错误,不优先推荐。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

