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宣告和賦值應分開
SC2164cd 失敗時未處理
SC2006使用 $() 代替反引號

嚴重程度

# 只顯示錯誤
shellcheck -S error script.sh

# 顯示警告及以上
shellcheck -S warning script.sh

# 顯示所有(包括風格建議)
shellcheck -S style script.sh

編輯器整合

VS Code

安裝 ShellCheck 擴展

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 {} +