shellcheck
Shell 腳本靜態分析工具,找出常見錯誤和潛在問題
安裝
# macOS
brew install shellcheck
# Ubuntu/Debian
sudo apt install shellcheck
# Arch Linux
sudo pacman -S shellcheck基本用法
# 檢查腳本
shellcheck script.sh
# 檢查多個腳本
shellcheck script1.sh script2.sh
# 從 stdin 讀取
cat script.sh | shellcheck -輸出格式
# 預設格式(終端友好)
shellcheck script.sh
# JSON 格式
shellcheck -f json script.sh
# GCC 格式(適合 CI)
shellcheck -f gcc script.sh
# 檢查碼格式
shellcheck -f checkstyle script.sh指定 Shell
# 指定為 bash
shellcheck -s bash script.sh
# 指定為 sh (POSIX)
shellcheck -s sh script.sh
# 指定為 zsh
shellcheck -s zsh script.sh排除警告
命令列排除
# 排除特定警告
shellcheck -e SC2034 script.sh
# 排除多個警告
shellcheck -e SC2034,SC2086 script.sh腳本內排除
#!/bin/bash
# shellcheck disable=SC2034
unused_var="value"
# 排除整個區塊
# shellcheck disable=SC2086
echo $unquoted_var配置檔排除
在 .shellcheckrc 中:
disable=SC2034,SC2086常見警告碼
| 警告碼 | 說明 |
|---|---|
| SC2034 | 未使用的變數 |
| SC2086 | 變數未加引號 |
| SC2046 | 命令替換未加引號 |
| SC2155 | 宣告和賦值應分開 |
| SC2164 | cd 失敗時未處理 |
| SC2006 | 使用 $() 代替反引號 |
嚴重程度
# 只顯示錯誤
shellcheck -S error script.sh
# 顯示警告及以上
shellcheck -S warning script.sh
# 顯示所有(包括風格建議)
shellcheck -S style script.sh編輯器整合
VS Code
Vim
使用 ALE 或 Syntastic 插件
範例 .vimrc
let g:ale_linters = {'sh': ['shellcheck']}CI 整合
GitHub Actions
- name: ShellCheck
uses: ludeeus/action-shellcheck@master手動 CI
find . -name "*.sh" -exec shellcheck {} +