首页/系统与基础设施/自动化运维速查/自动化脚本的编码与换行兼容
自动化基础与选型50 条

自动化脚本的编码与换行兼容

脚本的编码与换行差异会在跨平台时静默出问题:Windows 的换行会带来多余回车导致脚本报错,带 BOM 的 UTF-8 会让某些解释器在第一行就失败,非 UTF-8 编码则在含中文输出时乱码或截断。做法是统一使用无 BOM 的 UTF-8 与换行约定,并在提交与部署环节自动检查。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

三类常见问题

第一类换行符:Windows 使用回车加换行,Linux 只使用换行,带回车换行的脚本在 Linux 上执行时,解释器会把回车当成命令的一部分,报出难以理解的错误,例如提示找不到某命令但命令看起来很正常。第二类编码与 BOM:带字节顺序标记的 UTF-8 文件在部分解释器与配置解析中会在开头混入不可见字符,导致第一行语法错误。第三类字符集:脚本里含中文提示或路径时,若文件编码与运行环境不一致,会出现乱码、字符串比较失效甚至截断。

基本信息

推荐编码无 BOM 的 UTF-8
换行约定跨平台脚本统一使用换行符
检查时机提交前检查,部署前验证
常见受影响文件shell 脚本、配置文件、清单与模板

落地做法

  • 统一保存为无 BOM 的 UTF-8,并写入团队约定。
  • 在版本控制中固定换行处理,避免有人整文件转换后产生巨大差异。
  • 在提交或流水线中加入自动检查,发现换行或 BOM 问题直接失败。
  • 脚本中避免使用依赖本地语言的输出解析,必要时固定语言环境。
  • 跨平台分发时用明确的转换步骤,而不是手工另存。
  • 把编码要求写进模板与脚手架,让新资产默认就是正确的。

检查与修正

检查与修正
# 检查是否含有回车符(Windows 换行)
file ./deploy.sh                       # 输出中若出现 CRLF 说明换行不符

grep -rlU $'\r' ./scripts || echo 'OK: 未发现回车符'   # 批量排查

# 去除回车符并去掉可能的 BOM
sed -i 's/\r$//' ./deploy.sh            # 修正换行
sed -i '1s/^\xEF\xBB\xBF//' ./deploy.sh # 去除 UTF-8 BOM 标记
bash -n ./deploy.sh && echo 'OK: 语法通过'

问题表现与修正

问题典型表现修正方式
带回车换行提示命令或参数不存在转换为单一换行符
带 BOM 标记首行语法错误或配置解析失败保存为无 BOM 格式
编码不一致中文乱码、比较失效统一为无 BOM 的 UTF-8
语言环境不同解析命令输出失败固定语言环境或用机器可读输出
整文件被转换提交差异巨大且难以评审规范换行处理,避免批量转换
把检查做成自动门禁比写进规范更有效:换行与 BOM 问题在编辑器里不可见,人工评审几乎无法发现。
Windows 上运行的脚本如果由其他工具调用,同样要考虑反向问题:只使用换行的批处理文件在 Windows 上可能表现异常,跨平台资产应明确各自的换行要求。

易错点

  • 把 Windows 上编辑的脚本直接放到 Linux 执行:报错信息指向不存在的命令,排查方向被误导到环境变量上
  • 文件带 BOM 且被解释器读取:首行出现不可见字符,语法错误位置与实际不符
  • 含中文输出但编码不一致:日志乱码,字符串比较永远不成立,判断逻辑静默失效
  • 为修正换行整文件重写:提交记录产生全文件差异,掩盖了真正的逻辑改动

数据来源与参考

  • Unicode 标准附录中关于字节顺序标记的说明
  • POSIX 规范与 shell 官方文档中关于脚本解释与换行的说明
  • Git 官方文档(core.autocrlf 与换行处理配置)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/automation-script-encoding-line-ending.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​​​​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​