You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:53:14