Linux脚本命令行运行正常,crontab调用时grep相关语法报错求助
解决crontab调用ksh脚本时的
syntax error at line 11 : (' unexpected`错误 这个问题的核心原因是crontab环境中使用的ksh版本与你命令行中使用的版本不一致:旧版本的ksh(比如pdksh)不支持job_list=($( grep ... ))这种直接将命令输出转换为数组的语法,而你命令行里的ksh(比如ksh93)是支持该语法的,所以才会出现「命令行正常运行、crontab调用报错」的差异。
下面提供几个可行的解决方案:
方案1:改用兼容全版本ksh的数组赋值方式
把数组赋值的代码替换成通过while read循环逐行读取并添加到数组,这种写法在所有ksh版本中都能兼容:
job_list=() # 用进程替换读取grep的输出,逐行添加到数组 while IFS= read -r line; do job_list+=("$line") done < <(grep -e ':'"$batch"'$' "${dir}/${file}")
方案2:指定crontab使用支持数组语法的ksh版本
如果你的系统安装了ksh93(通常路径是/usr/bin/ksh93),直接修改crontab中的SHELL配置,指向新版本的ksh:
SHELL=/usr/bin/ksh93 PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO= HOME=/ * * * * * script.sh >> nohup_1.out 2>&1
方案3:跳过数组直接遍历输出
如果你的需求只是打印匹配的行,完全可以不用数组,直接通过管道遍历grep的结果,这样既简化代码又避免数组语法的兼容性问题:
if [ -f "$dir/$file" ] ; then # 注意给变量加引号,避免路径含空格时判断出错 grep -e ':'"$batch"'$' "${dir}/${file}" | while IFS= read -r job; do echo "$job" done fi
另外补充一个小细节:脚本里的[ -f $dir/$file ]最好改成[ -f "$dir/$file" ],给变量加上双引号,避免路径中包含空格时出现判断错误。
内容的提问来源于stack exchange,提问作者Aavik
相关产品推荐
相关产品推荐

