Carpe Diem

備忘録

ShellCheckでシェルスクリプトをLint

背景

普段プログラミングでは特定の言語を使っていますが、シェルスクリプトはビルドスクリプトをいじる時くらいしか使わず都度検索して調べ直す事が多いです。

また使い方が間違っていてもテストする文化が浸透していないため、期待しない挙動になっていても気が付かないケースも多々あります。
ShellSpecBatsといったテストフレームワークはあるものの、そこまで複雑なことをさせないためテストはいいかとなりがち)

そういった課題を解決できるツールとしてShellCheckがあります。

環境

  • shellcheck 0.9.0

ShellCheck

ShellCheckはシェルスクリプトのLinter(静的解析ツール)です。

Playgroundが用意されており、↓で手軽にチェックできます。

ShellCheck – shell script analysis tool

例えば以下の例では変数代入の際に空白スペースは入れていけないことが指摘されています。

良いところ

ShellCheckの良いところを挙げていきます。

修正点を教えてくれる

単に問題点を指摘するだけでなく、どうやって修正すればいいかまで教えてくれるところです。

先程のケースも問題点の場所にURLがリンクされており、

リンク先へ飛ぶと修正方法が書かれています。

ShellCheck: SC2283 – Use `[ ]` to compare values, or remove spaces around `=` to assign (or quote `'='` if literal).

VS Code拡張機能が提供されている

VS Code拡張機能が提供されており、

marketplace.visualstudio.com

処理が軽量なためリアルタイムでチェックして指摘してくれます。

各プラットフォームで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を紹介しました。