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...
SC2046
とSC2006
というルールに引っかかっていることがわかる。
クオートしたほうが良いことと、バッククオートではなく$()
を使うべきということがわかる。
失敗したときの終了ステータスコードは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を選択しているのでshellcheck
はapt
でインストールする。
shellcheck
コマンドを実行するときに-f gcc
を指定すると、問題検出時、Pull Reuestにコメントするための形式で出力できるようになる。