介紹如何使用 ShellCheck 靜態指令稿分析工具,偵測 bash shell 指令稿中的臭蟲。
ShellCheck 是一個開放原始碼(GPLv3)的靜態指令稿分析工具,可以針對 bash/sh shell 指令稿進行檢查,偵測各種可能的程式碼問題,並提供改善建議。
ShellCheck 線上檢測工具
ShellCheck 提供了線上檢測 bash shell 指令稿的服務,只要將自己的 shell 指令稿貼上去,即可立即檢測指令稿中的臭蟲(bugs)。
Linux 安裝 ShellCheck
在 Linux 中若要安裝 ShellCheck,可以透過各種 Linux 中的套件管理系統來安裝:
# Ubuntu/Debian Linux 安裝 ShellCheck sudo apt install shellcheck # CentOS/RHEL/Fedora/Oracle Linux 安裝 ShellCheck sudo yum install epel-release sudo yum install ShellCheck # Fedora Linux 安裝 ShellCheck sudo dnf install ShellCheck # Arch Linux 安裝 ShellCheck sudo pacman -S shellcheck
macOS 安裝 ShellCheck
若在 macOS 中,則可以使用 MacPorts 或是 Homebrew 來安裝 ShellCheck:
# macOS 透過 MacPorts 安裝 ShellCheck port install shellcheck # macOS 透過 Homebrew 安裝 ShellCheck brew install shellcheck
使用 ShellCheck 指令工具
假設我們一個 bash shell 指令稿內容如下:
#!/bin/bash # 有問題的 Bash 指令稿 for f in $(ls *.m3u) do grep -qi hq.*mp3 $f \ && echo -e 'Playlist $f contains a HQ file in mp3 format' done
假設這個指令稿的檔案名稱為 myscript.sh
,我們可以利用 shellcheck
指令直接對此指令稿進行檢測:
# 檢測 Bash 指令稿
shellcheck myscript.sh
In script.sh line 3: for f in $(ls *.m3u) ^-- SC2045: Iterating over ls output is fragile. Use globs. ^-- SC2035: Use ./*glob* or -- *glob* so names with dashes won't become options. In script.sh line 5: grep -qi hq.*mp3 $f \ ^-- SC2062: Quote the grep pattern so the shell won't interpret it. ^-- SC2086: Double quote to prevent globbing and word splitting. In script.sh line 6: && echo -e 'Playlist $f contains a HQ file in mp3 format' ^-- SC2016: Expressions don't expand in single quotes, use double quotes for that.
ShellCheck 在終端機中的輸出還會有顏色: