ShellCheck 是专治 shell 脚本语法错误、运行时陷阱及方言兼容性问题的静态分析工具;它不检查缩进、换行、空格等代码规范,而是精准识别未引号变量、未定义变量、波浪符不展开、类型误用等导致崩溃或行为异常的问题,并依 shebang 或 -s 参数进行方言感知分析。

ShellCheck 不是用来检查“代码规范”的,它专治语法错误、运行时陷阱和 shell 方言兼容性问题;所谓缩进风格、for是否换行、空格数量、变量命名这些,它一概不报——别指望它替代 shfmt 或人工 CR。
shellcheck 安装后直接跑命令就能用
不用配环境、不依赖 Python、不需编译。各发行版安装方式不同,但使用统一:
- Ubuntu/Debian:
sudo apt install shellcheck - RHEL/CentOS(需先启用 EPEL):
sudo yum install epel-release && sudo yum install ShellCheck - macOS:
brew install shellcheck - Windows:下载
shellcheck.exe,加到PATH环境变量里
装完执行 shellcheck --version 确认可用。它不写配置文件,也不需要初始化项目,脚本丢过去就查。
shellcheck 会报哪些典型问题
它不关心你用了几个空格,但会揪出真正导致崩溃或行为异常的写法:
-
echo $HOME→ 报SC2086:未引号变量,遇到路径含空格就裂开 -
if [ $var = "ok" ]→ 报SC2153:未定义变量,且[ ]中变量为空时语法非法 -
rm "$file"但$file是~/my file.txt→ 报SC2088:波浪符在引号内不展开 -
for f in *.log; do ...→ 报SC2068:未用"${array[@]}"风格,通配符可能意外展开 -
if [[ $a -eq $b ]]; then但$a是字符串"abc"→ 报SC2154:数值比较前未校验类型,bash 会静默转成 0
每条警告都带编号(如 SC2086),去 https://www.shellcheck.net/wiki/SC2086 就能看原理+修复示例。
别把 shellcheck 当 lint 工具用
它不会提醒你 “for 和 do 应该换行”,也不会说 “函数名应该小写下划线”。它的强项是:
- 识别
#!/bin/sh脚本里误用[[或((导致在 dash 下直接失败 - 发现
$(ls)这种无意义命令替换(SC2012) - 指出
cd dir没检查返回值,目录不存在时脚本仍往下执行(SC2164) - 检测到
eval或set -e使用不当引发静默失败
如果你真想统一风格,得搭配 shfmt -w -i 2 script.sh 自动格式化,再用 shellcheck 查逻辑缺陷——两者定位完全不同。
最容易被忽略的是方言感知:同一行 (( area = 3.14 * r * r )),在 #!/bin/sh 下报错,在 #!/bin/bash 下只警告不支持小数,在 #!/bin/ksh 下完全放过。不写 shebang 或乱设 -s 参数,shellcheck 的建议就可能南辕北辙。


















