背景
普段プログラミングでは特定の言語を使っていますが、シェルスクリプトはビルドスクリプトをいじる時くらいしか使わず都度検索して調べ直す事が多いです。
また使い方が間違っていてもテストする文化が浸透していないため、期待しない挙動になっていても気が付かないケースも多々あります。
(ShellSpecやBatsといったテストフレームワークはあるものの、そこまで複雑なことをさせないためテストはいいかとなりがち)
そういった課題を解決できるツールとしてShellCheckがあります。
環境
- shellcheck 0.9.0
ShellCheck
ShellCheckはシェルスクリプトのLinter(静的解析ツール)です。
Playgroundが用意されており、↓で手軽にチェックできます。
ShellCheck – shell script analysis tool
例えば以下の例では変数代入の際に空白スペースは入れていけないことが指摘されています。
良いところ
ShellCheckの良いところを挙げていきます。
修正点を教えてくれる
単に問題点を指摘するだけでなく、どうやって修正すればいいかまで教えてくれるところです。
先程のケースも問題点の場所にURLがリンクされており、
リンク先へ飛ぶと修正方法が書かれています。
VS Codeの拡張機能が提供されている
処理が軽量なためリアルタイムでチェックして指摘してくれます。
各プラットフォームでCLIが提供されている
CLIツールが各プラットフォーム用にビルドされており、例えばmacOSであればbrewでインストールできます。
$ brew install shellcheck
先程のシェルスクリプトもリンク付きで問題点が表示されます。
$ shellcheck foo.sh In foo.sh line 3: x = 10 ^-- SC2283 (error): Remove spaces around = to assign (or use [ ] to compare, or quote '=' if literal). In foo.sh line 4: echo ${x} ^--^ SC2154 (warning): x is referenced but not assigned. ^--^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: echo "${x}" For more information: https://www.shellcheck.net/wiki/SC2283 -- Remove spaces around = to assign ... https://www.shellcheck.net/wiki/SC2154 -- x is referenced but not assigned. https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
各種CIサービスでも提供されている
ShellCheckは各種CIサービスでプリインストールされていたり、プラグインで利用できる状態になっているので気軽に導入できます。
ignoreができる
ignore機能で特定のエラーを無視できます。
-e
オプションだったり
$ shellcheck -e SC2059 foo.sh
環境変数SHELLCHECK_OPTS
で指定できます。
export SHELLCHECK_OPTS="-e SC2059 -e SC2034 -e SC1090"
Ignore · koalaman/shellcheck Wiki · GitHub
まとめ
シェルスクリプトのLintができるShellCheckを紹介しました。