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

如何修复Bash脚本出现“Syntax error near expected ‘fi’”语法错误

Bash脚本"Syntax error near expected 'fi'"报错定位与修复

定位方法

  • 优先用Bash内置语法校验工具定位精确错误行:执行bash -n 你的脚本路径.sh,该命令不会实际运行脚本,会直接输出语法错误对应的行号,是Shell脚本语法排错的最高效手段
  • 针对这类fi附近的语法错,重点排查三类高频问题:
    • 关键字配对错误:确认if ...; then和fi一一对应,没有漏写then、多写/漏写fi
    • 隐藏格式问题:如果脚本是在Windows系统下编辑后传到Linux运行的,行尾会带Windows特有的CRLF换行符,会导致Bash无法正确识别Shell关键字,触发这类报错,直接执行dos2unix 你的脚本路径.sh转换格式即可
    • 变量空值展开问题:这也是你贴的脚本最容易触发该报错的隐性原因——如果ping执行失败、grep没有匹配到received行、或者awk取字段失败,count变量会被赋值为空字符串,此时if判断行展开后会变成if [ -eq 0 ]; then,[(test命令)缺少左操作数,Bash抛出的语法错误会被误定位到附近的fi行,很容易误导排查方向

修复方案

针对你写的批量Ping检测脚本,修复点主要是给count变量加空值兜底、规范判断写法,避免空值触发语法错,修复后完整代码如下:

#!/bin/bash
HOSTS="cyberciti.biz theos.in router"
COUNT=4

for myHost in $HOSTS
do
  count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
  # 给count加默认值,取值失败时默认设为0,避免空值
  count=${count:-0}
  # 给变量加双引号包裹,避免特殊字符触发语法问题
  if [ "$count" -eq 0 ]; then
    # 100% 丢包
    echo "Host : $myHost is down (ping failed) at $(date)"
  fi
done

额外注意事项

  • Shell中[是内置命令,和后续参数、结尾的]之间必须保留空格,类似if [$count -eq 0];then这类缺空格的写法,也会触发语法错误,报错位置经常被定位到后续的fi行
  • 如果把then和if写在同一行,if判断的结尾和then之间必须加分号,要么就把then单独放在新行,否则也会报语法错

内容的提问来源于stack exchange,提问作者T. Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:06:22