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不符合预期的错误。
具体修复步骤
- 替换
-a为&&,拆分条件判断
把合并在一个test里的条件拆成两个独立的test命令,用&&连接,这是POSIX标准推荐的写法,兼容性更强:
# 原代码 if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then # 修改后 if [ "$INSTALLDIR" != "" ] && [ "`expr index "$CRONSCRIPT" /`" != "1" ];then
同时给$CRONSCRIPT加上引号,避免变量包含空格时导致expr命令参数混乱。
- 额外优化:给所有变量引用加引号
这能避免变量值包含空格、特殊字符时出现意外的参数拆分问题,提升脚本的健壮性。
修改后的完整脚本
#!/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
相关产品推荐
相关产品推荐

