Linux: ShellCheckでシェルスクリプトの静的解析を実行する

ShellCheckでシェルスクリプトの静的解析を実行する手順を記載します。

1 ShellCheckをインストールする

Ubuntuの場合はshellcheckパッケージをインストールします。

$ sudo apt install -y shellcheck

CentOSの場合はEPELからShellCheckパッケージをインストールします。

$ sudo yum install -y epel-release
$ sudo yum install -y ShellCheck

2 ShellCheckで静的解析を実行する

次のコードに対して静的解析を実行します。

$ cat SC2068.sh
#!/bin/sh

for arg in $@; do
  echo arg = "${arg}"
done

$@をダブルコーテーションで括っていないというエラーが出力されます。

$ shellcheck SC2068.sh

In SC2068.sh line 3:
for arg in $@; do
           ^-- SC2068: Double quote array expansions, otherwise
they're like $* and break on spaces.

3 サポートしているシェルの種類

サポートしているシェルはsh, bash, kshです。それぞれのシェルのシンタックスに合わせた検出結果になります。

シェルの種類はシェバングを見て決めますが、シェバングがない場合などの為に-sオプションでシェルの種類を設定することができます。

$ shellcheck -s sh <script>

4 出力フォーマットの種類

エディタやJenkinsで利用できるフォーマットがサポートされています。

4.1 gcc

-f gccオプションでGCCライクな出力になります。

$ shellcheck -f gcc <script>

これはemacs上などで該当箇所にジャンプするのに便利です。以下はCompile commandでshellcheckを実行したものです。

0001_shellcheck-gcc.png

4.2 checkstyle

-f checkstyleオプションでcheckstyleフォーマットの出力になります。これはJenkinsのCheckstyle Pluginで読み込むことができます。

なお、shellcheckは検出があると戻り値が偽となります。ビルドエラーを回避する為、プロジェクトの設定で"Build"の"Execute shell"にて、shellcheckの戻り値が偽の際にtrueコマンドを実行します。

shellcheck -f checkstyle <script> > checkstyle.xml || true

作成されたcheckstyle.xmlを"Post-build Actions"の"Publish Checkstyle analysis results"で読み込ませると以下のようになります。

0002_shellcheck-checkstyle.png