ShellCheck 是什么
ShellCheck 检查 Shell 脚本里的经典陷阱:SC2086(变量未加引号)、SC2046(未加引号的命令替换)是最常见的两类,往往在路径含空格或变量为空时才暴露出来。它按 sh、bash、dash 等方言解析脚本,是脚本评审的默认工具。
基本信息
| 典型告警 | SC2086 引号缺失、SC2046 命令替换未加引号 |
|---|---|
| 级别 | error / warning / info / style,可按级别过滤 |
| 方言 | -s bash / sh / dash / ksh,默认按 shebang 判断 |
| 运行方式 | 命令行、CI 步骤、编辑器插件 |
典型使用场景
- 部署脚本评审:未加引号与未检查退出码属于高发问题
- CI 里统一检查 scripts 目录:一次运行覆盖全部脚本
- 排查偶发失败:变量为空或路径含空格时的行为差异
- 老脚本清理:先滤掉风格类,集中修 error 与 warning
- 与 shfmt 配合:格式交给 shfmt,语义问题交给 ShellCheck
高频告警与修法
- SC2086:给变量加双引号,或用数组承载参数
- SC2046:命令替换的结果同样要加引号
- SC2164:切换目录前加失败退出,避免继续往下执行
- SC2006:反引号写法改为美元括号形式
常用命令
常用命令
shellcheck script.sh # 检查单个脚本
shellcheck -s bash *.sh # 指定方言批量检查
shellcheck --severity=warning script.sh # 只报 warning 及以上
# 确有必要时用行内注释豁免,并写明原因级别与处理建议
| 级别 | 含义 | 处理建议 |
|---|---|---|
| error | 几乎确定是错误 | 立即修复 |
| warning | 可能导致错误行为 | 优先修复,暂缓需说明理由 |
| info | 可读性或可移植性问题 | 按项目规范决定 |
| style | 风格建议 | 可批量关闭,减少噪声 |
对 scripts 目录整体执行:成本很低,能拦住大量脚本类事故。
在评审中的用法:把 ShellCheck 接进流水线并固定版本,作者提交前先跑一遍;评审者可以专注脚本的业务逻辑与失败处理是否合理。
SC 编号是沟通捷径:评论里写 SC2086,作者一看就知道是变量未加引号,不必再反复描述现象。
用禁用注释抹平告警:脚本又回到平时没问题、上线就出事的状态。