如何修复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
相关产品推荐
相关产品推荐

