Bash 脚本中 syntax error near unexpected token 怎么排查?

文章导读
直接定位报错行号,检查脚本首行 Shebang 声明,并排除 Windows 换行符干扰。修改前务必备份原文件,避免服务中断。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

直接定位报错行号,检查脚本首行 Shebang 声明,并排除 Windows 换行符干扰。修改前务必备份原文件,避免服务中断。

先说结论:该错误属于 Bash 解析阶段故障,脚本未开始执行即停止,优先检查语法结构而非运行逻辑。

  • 先确认:报错提示的具体行号和 token 内容
  • 先处理:统一换行符格式并修复缺失的关键字
  • 再验证:使用 bash -n 预检查确保无语法残留

命令速用版

bash -n script.sh          # 语法检查不执行
cat -A script.sh           # 查看隐藏字符
sed -i 's/\r$//' script.sh # 移除 Windows 回车符

为什么会这样

Bash 在执行脚本前会先进行词法分析和语法解析,遇到无法识别的字符或结构不完整时直接抛出异常。该错误通常发生在脚本读取阶段,而非命令运行阶段,因此修改逻辑代码无效,必须修正语法格式。

分步处理

步骤 1:定位报错行号
查看错误信息末尾的行号数字,使用编辑器跳转至该行。注意报错行有时是错误发生的下一行,需同时检查上一行末尾是否缺少分号或反斜杠。

Bash 脚本中 syntax error near unexpected token 怎么排查?

步骤 2:检查 Shebang 声明
确认脚本第一行是否为 #!/bin/bash#!/usr/bin/env bash。若缺失或使用 #!/bin/sh,部分 Bash 特有语法会被识别为意外 token。

步骤 3:清理换行符
在 Windows 编辑的脚本常包含 \r\n 换行符,Linux 仅识别 \n。执行 sed -i 's/\r$//' 脚本名dos2unix 脚本名 转换格式。

步骤 4:修复语法结构
检查 if 是否配对 then/fifor/while 是否配对 do/done。确保 [ ] 测试命令内部两侧有空格,字符串变量引用加双引号。

怎么验证是否生效

执行 bash -n 脚本名 命令,若终端无输出且返回码为 0,表示语法检查通过。随后尝试正式运行脚本,观察是否仍有报错。

Bash 脚本中 syntax error near unexpected token 怎么排查?

常见坑

  • 空格缺失:[ "$a"=="$b" ] 会报错,必须写成 [ "$a" == "$b" ]
  • 特殊字符:脚本中包含 <>| 等字符未转义时,可能被误解析为重定向或管道。
  • 函数定义:Bash 函数定义后调用前需确保语法完整,花括号 { } 内部命令需以分号结尾。
  • 隐藏字符:从网页复制的代码常包含不可见字符,建议手动输入或使用 cat -A 排查。

常见问题

报错行号一定准确吗?

通常准确,但有时指向错误行的下一行。解析器可能在读完下一行才发现上一行结构未闭合,需向上回溯检查。

为什么终端能跑脚本报错?

交互模式与脚本模式解析规则存在差异。终端输入时 Bash 会即时提示补全,而脚本文件要求严格的语法结构。

如何开启调试模式?

在脚本首行添加 set -x 或使用 bash -x 执行。调试模式会打印每行执行内容,帮助定位逻辑错误而非语法错误。

参考来源

  • GNU Bash Manual, Bash POSIX Mode, https://www.gnu.org/software/bash/manual/html_node/index.html
  • GNU Coreutils, cat command, https://www.gnu.org/software/coreutils/manual/html_node/cat-invocation.html