macOS下Bash脚本条件语句触发"unexpected end of file"错误
macOS Bash脚本报「syntax error: unexpected end of file」的排查与解决
问题场景
在macOS Sonoma 14.4.1的Bash环境下,执行source命令加载包含if条件语句的脚本时,触发「syntax error: unexpected end of file」错误;移除该if语句后脚本可正常运行,但相同脚本在CentOS 7系统中能正常执行并输出预期内容,且已确认脚本使用Unix换行符(LF)。
核心原因
macOS默认预装的Bash版本为3.2.57(受版权限制未更新至4.x系列),而CentOS 7搭载的是Bash 4.2.46,两者在语法兼容性上存在差异。你的if语句大概率使用了Bash 4.x专属的语法特性,导致旧版本Bash无法解析,从而抛出语法错误。
常见的Bash 4.x专属语法包括:
- 关联数组(
declare -A定义) [[ ... ]]条件表达式中部分正则匹配扩展特性- 部分变量替换的高级写法
解决办法
1. 修正if语句为兼容写法
将依赖Bash 4.x的if逻辑替换为Bash 3.x支持的语法。例如:
如果原if语句是通过版本判断:
# 原Bash 4.x兼容写法(macOS会报错) if [[ $BASH_VERSION == 4.* ]]; then echo "Running Bash 4+" fi
可改为case语句替代:
# 兼容Bash 3.x的写法 case "$BASH_VERSION" in 4.*) echo "Running Bash 4+" ;; esac
或借助grep实现版本判断:
if bash --version | grep -q "version 4\."; then echo "Running Bash 4+" fi
2. 升级macOS的Bash版本
通过Homebrew安装新版Bash,彻底解决版本兼容问题:
# 安装Homebrew(若未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装新版Bash brew install bash
安装完成后,将脚本的shebang行修改为新版Bash路径:
#!/opt/homebrew/bin/bash # M1/M2芯片设备 # 或 #!/usr/local/bin/bash # Intel芯片设备
之后使用新版Bash执行或source脚本即可。
验证方法
- 在macOS终端执行
bash --version确认当前Bash版本 - 应用上述任一解决方法后,重新执行
source 脚本名.sh验证是否正常运行
内容的提问来源于stack exchange,提问作者Curtis G.
相关产品推荐
相关产品推荐

