ShellCheckとは

ShellCheck はシェルスクリプトのLintで静的解析ツール。

よくない書き方や不具合を引き起こしそうな記述を検出してくれる。

ShellCheckの使い方

インストール

Macの場合はHomebrewでインストールできる。

$ brew install shellcheck

yumなど他のOSのパッケージマネージャーでもshellcheckという名前で提供されている。
例えばCentOSの場合は以下のようにインストールできる。

$ yum install shellcheck

実行

shellcheckコマンドにシェルスクリプトを渡して実行する。

$ shellcheck script.sh

結果

シェルスクリプトを以下のように記述した場合。

#!/bin/bash

echo "Hello World!" > /tmp/hello-`date +%s`.txt

shellcheckコマンドを実行すると以下のような結果となる。

$ shellcheck script.sh
In script.sh line 3:
echo "Hello World!" > /tmp/hello-`date +%s`.txt
                                 ^--------^ SC2046 (warning): Quote this to prevent word splitting.
                                 ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean:
echo "Hello World!" > /tmp/hello-$(date +%s).txt

For more information:
  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
  https://www.shellcheck.net/wiki/SC2006 -- Use $(...) notation instead of le...

SC2046SC2006というルールに引っかかっていることがわかる。
クオートしたほうが良いことと、バッククオートではなく$()を使うべきということがわかる。

失敗したときの終了ステータスコードは1となる。

$ echo $?
1

ShellCheckのルール

ShellCheckで検出できるルールは以下に記載されている。

ShellCheck - Wiki

除外設定

ルールを除外するには--excludeオプション(-eオプション)を指定して以下のように実行する。

$ shellcheck script.sh -e SC2046

In script.sh line 3:
echo "Hello World!" > /tmp/hello-`date +%s`.txt
                                 ^--------^ SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean:
echo "Hello World!" > /tmp/hello-$(date +%s).txt

For more information:
  https://www.shellcheck.net/wiki/SC2006 -- Use $(...) notation instead of le...

SC2046が除外されている。

複数のルールを除外するにはカンマ(,)で区切って指定する。

$ shellcheck script.sh -e SC2046,SC2006

深刻度(severity)

検出される問題の深刻度はルールごとに以下のように定められている。

  • error
  • warning
  • info
  • style

チームやプロジェクトでどの深刻度までを許容するかを決めておくと良い。

検出される深刻度のレベルを指定するには--severityオプション(-Sオプション)を指定する。

$ shellcheck script.sh -S warning

In script.sh line 3:
echo "Hello World!" > /tmp/hello-`date +%s`.txt
                                 ^--------^ SC2046 (warning): Quote this to prevent word splitting.

For more information:
  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...

-Sオプションにwarningを指定しているのでwarning以上の問題のみが検出されている。

GitHub ActionsでShellCheckを実行する

GitHub ActionsでShellCheckを実行するには以下のようにする。

name: shellcheck

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # リポジトリをチェックアウト
    - uses: actions/checkout@v4
      # ShellCheckをインストール
    - name: Install shellcheck
      run: sudo apt install shellcheck
      # 問題を検出したら Pull Request にコメントする
    - name: Enable problem matcher
      run: echo "::add-matcher::.github/shellcheck-gcc.json"
      # シェルスクリプトを検索してShellCheckを実行
    - name: Check with shellcheck
      run: |
        shellcheck setup.sh -f gcc
        find . -type f | grep "/run" | xargs shellcheck -e SC1091,SC2046 -f gcc        

実行イメージをUbuntuを選択しているのでshellcheckaptでインストールする。

shellcheckコマンドを実行するときに-f gccを指定すると、問題検出時、Pull Reuestにコメントするための形式で出力できるようになる。