首页/开发/代码质量与评审速查/ShellCheck:Shell 脚本检查
规范与静态检查65 条

ShellCheck:Shell 脚本检查

ShellCheck 检查 Shell 脚本的经典陷阱:SC2086(变量未加引号)、SC2046(未加引号的命令替换)等,是脚本评审的默认工具。

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,作者一看就知道是变量未加引号,不必再反复描述现象。
用禁用注释抹平告警:脚本又回到平时没问题、上线就出事的状态。

易错点

  • SC2086 高频出现:未加引号的变量遇到含空格的路径直接出错
  • 用禁用注释抹平一切告警:检查等于关掉
  • 不指定方言:脚本按错误的方言解析,产生大量误报
  • 只检查新增脚本:历史脚本里的同一类问题长期留在系统里
  • 把脚本检查当作可选项:部署与巡检脚本出错的影响面往往比应用代码更大

数据来源与参考

  • ShellCheck 官方仓库(github.com/koalaman/shellcheck)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌