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

Shell脚本报错Syntax error: "fi" unexpected (expecting "then")求助

解决Shell脚本的"Syntax error: 'fi' unexpected (expecting 'then')"报错

你的脚本结构逻辑本身是通顺的,但这个报错大概率是因为外层if条件里的-a逻辑与参数导致的——很多POSIX兼容的/bin/sh实现(比如很多系统默认的dash)对test命令中的-a支持不佳,尤其是当条件嵌套了命令替换(比如你的expr index调用)时,容易出现语法解析混乱,让Shell误判if的结构,最终抛出fi不符合预期的错误。

具体修复步骤

  1. 替换-a为&&,拆分条件判断
    把合并在一个test里的条件拆成两个独立的test命令,用&&连接,这是POSIX标准推荐的写法,兼容性更强:
# 原代码
if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then

# 修改后
if [ "$INSTALLDIR" != "" ] && [ "`expr index "$CRONSCRIPT" /`" != "1" ];then

同时给$CRONSCRIPT加上引号,避免变量包含空格时导致expr命令参数混乱。

  1. 额外优化:给所有变量引用加引号
    这能避免变量值包含空格、特殊字符时出现意外的参数拆分问题,提升脚本的健壮性。

修改后的完整脚本

#!/bin/sh
if [ ! "$1" = "" ];then
    CRONSCRIPT="$1"
else
    CRONSCRIPT="cron.php"
fi
MODE=""
if [ ! "$2" = "" ] ;then
    MODE=" $2"
fi
PHP_BIN=$(command -v php)
INSTALLDIR=$(echo "$0" | sed 's/cron\.sh//g')
if [ "$INSTALLDIR" != "" ] && [ "`expr index "$CRONSCRIPT" /`" != "1" ];then
    if ! ps auxwww | grep "$INSTALLDIR$CRONSCRIPT$MODE" | grep -v grep 1>/dev/null 2>/dev/null;then
        "$PHP_BIN" "$INSTALLDIR$CRONSCRIPT$MODE" &
    fi
else
    if ! ps auxwww | grep "$CRONSCRIPT$MODE" | grep -v grep | grep -v cron.sh 1>/dev/null 2>/dev/null;then
        "$PHP_BIN" "$CRONSCRIPT$MODE" &
    fi
fi

调试建议

如果修复后仍有问题,可以用sh -x your_script.sh运行脚本,查看每一步的执行细节;也可以用shellcheck工具扫描脚本,它能快速定位POSIX兼容性错误和其他常见的Shell脚本问题。

内容的提问来源于stack exchange,提问作者Jpenailillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:37:46