随机
Enter 搜索 ↑↓ 切换 Esc 清空

shellcheck

命令

Shell脚本语法和规范检查工具

shellcheck

Shell脚本语法和规范检查工具

补充说明

ShellCheck 是一个用于Shell脚本(bash、sh、dash等)的静态分析工具。它能够检测脚本中的语法错误、常见问题、风格问题以及潜在的bug,并提供详细的修复建议。

ShellCheck支持多种Shell方言:

主要功能:

安装ShellCheck

Debian / Ubuntu:

sudo apt update
sudo apt install -y shellcheck

CentOS / Rocky / RHEL:

sudo yum install -y epel-release
sudo yum install -y ShellCheck

macOS:

brew install shellcheck

Arch Linux:

sudo pacman -S shellcheck

语法

shellcheck [OPTIONS] <files>
shellcheck [OPTIONS] - <stdin>

选项

# 常用选项
-e, --exclude=CODE1,CODE2  # 排除指定规则警告
-f, --format=FORMAT        # 输出格式(checkstyle, diff, gcc, json, json1, quiet, tty)
-c, --color=WHEN          # 颜色输出(never, always, auto)
-s, --shell=NAME          # 指定Shell类型(bash, sh, dash, ash)
-x, --external-sources    # 允许检查外部源文件
-w, --wiki               # 输出对应规则的维基百科链接
-V, --version            # 显示版本信息

# 检查范围
--shell=bash             # 检查bash脚本
--shell=sh               # 检查sh脚本

输出格式

# 默认格式(人类可读)
shellcheck script.sh

# JSON格式(适合程序处理)
shellcheck -f json script.sh

# GCC格式(适合IDE集成)
shellcheck -f gcc script.sh

# Checkstyle格式(适合CI/CD)
shellcheck -f checkstyle script.sh

常用实例

# 检查单个脚本
shellcheck myscript.sh

# 检查多个脚本
shellcheck script1.sh script2.sh

# 排除指定规则
shellcheck -e SC1090,SC1091 myscript.sh

# 指定Shell类型
shellcheck -s bash myscript.sh

# 从stdin读取
cat myscript.sh | shellcheck -

# 输出Wiki链接(方便查看规则说明)
shellcheck -w myscript.sh

常见错误代码

代码 说明
SC1000 未闭合的双引号
SC1001 奇怪的转义字符
SC1018 未声明的单词(变量)
SC1035 缺少fi关键字
SC1047 缺少do关键字
SC1068 括号缺少闭合
SC1071 缺少then关键字
SC1083 转义字符问题
SC1090 无法读取源文件
SC1091 source文件不存在
SC2001 未声明的变量
SC2004 使用$()代替$[ ]
SC2028 echo不支持转义
SC2034 变量未使用
SC2044 使用find -print0
SC2086 引号问题导致参数扩展
SC2148 需要set -e
SC2154 变量未声明
SC2162 read缺少-p选项
SC2196 某些特性不支持

在编辑器中使用

Vim/Neovim

使用vim-shellcheck插件或手动集成:

" vimrc
autocmd FileType sh nnoremap <buffer> <leader>s :!shellcheck -x %<CR>

VS Code

安装ShellCheck扩展后自动启用检查。

在CI/CD中使用

GitLab CI示例:

test:shellcheck:
  script:
    - shellcheck scripts/*.sh

GitHub Actions示例:

- name: ShellCheck
  uses: ludeeus/action-shellcheck@master

忽略特定检查

在脚本中添加注释忽略检查:

# shellcheck disable=SC2086
# 忽略SC2086规则(引号问题)
echo $var_without_quotes

检查Shell脚本最佳实践

# 启用严格模式检查
shellcheck -o all script.sh

# 检查所有Shell类型
shellcheck -s bash -s sh script.sh

修复建议示例

输入脚本:

#!/bin/bash
echo $1

ShellCheck输出:

Line 2:
echo $1
^-- SC2086: Double quote to prevent globbing and word splitting.

修复后:

#!/bin/bash
echo "$1"

常见问题

Q: ShellCheck报错"not executed as root"?

A: 使用sudo运行ShellCheck,或忽略此警告。

Q: 如何检查远程脚本?

A: 使用curl获取远程脚本并通过管道传递给ShellCheck:

curl -s https://example.com/script.sh | shellcheck -

Q: ShellCheck支持哪些Shell?

A: 主要支持bash、sh、dash、ash、BusyBox ash等。