シェルスクリプトの問題点をチェックする方法【ShellCheck】 | Linux Fan

シェルスクリプトの問題点をチェックする方法【ShellCheck】

2018年7月21日

シェルスクリプトを作ったけれども、思った通りに動かないことってありますよね。

自分でデバッグしようとしても、なかなか原因が分からないことも多いでしょう。

そんな時に役に立つのが「ShellCheck」です。シェルスクリプトの問題点を指摘してくれるツールです。

バグだけでなく、推奨されない書き方や、無駄な部分などもまとめて教えてくれるので、うまく使えばシェルスクリプトの品質をグッと高めることができます。

シェルスクリプトを書いたら、うまく動いていても「ShellCheck」で確認するようにすれば、シェルスクリプトを書くスキルの向上にも役立つでしょう。

ShellCheckのインストール

ShellCheckのサイト(https://www.shellcheck.net/)にアクセスすると、シェルスクリプトをコピペしてチェックを実行できます。

しかし、本格的に使うなら「shellcheck」コマンドをインストールして、手元で実行するのが良いでしょう。

Ubuntuの場合、以下のボタンをクリックしてインストールできます。

次のコマンドでインストールすることもできます。

Ubuntu/Debian系の場合

sudo apt install -y shellcheck

Fedoraの場合

sudo dnf -y install ShellCheck

ShellCheckの使い方

次のように、シェルスクリプトを指定して実行するだけです。

shellcheck test.sh

例として、次の問題のあるスクリプトをチェックしてみましょう。

#!/bin/bash
var="$1"

if [ -n $var ]; then
  echo "変数「var」は空ではありません"
else
  echo "変数「var」は空です"
fi

第1引数が空文字列かどうかを調べて出力する、単純なスクリプトです。しかし、「example.sh」という名前で保存して次のように実行しても、期待どおりに動作しません。

$ bash example.sh
「-n」で調べたところ、変数「var」は空ではありません

引数を与えずに実行したのに、「空ではありません」と出力されていまいます。

このスクリプトをshellcheckコマンドでチェックすると次のようになります。

$ shellcheck example.sh

In example.sh line 4:
if [ -n $var ]
        ^-- SC2070: -n doesn't work with unquoted arguments. Quote or use [[ ]].
        ^-- SC2086: Double quote to prevent globbing and word splitting.

SC2070は、「-nにクォートされていない引数を与えてもうまく動かないので、クォートするか[[ ]]を使いなさい」という指摘です。先ほど動作しなかったのは、「$var」が空なので「[ -n ]」が実行され、「真」となっていたためでした。

また、SC2086は、「ワイルドカードなどがファイル名に展開されたり、スペースを含む文字列が分断されたりする問題を防ぐため、ダブルクォートしなさい」という指摘です。

なお、「SC」から始まる各「ルール」の説明は、ShellCheckのWikiに掲載されています。

指摘された問題を解決するには、「[ -n $var ]」を「[[ -n $var ]]」として以下のように書き換えます。

#!/bin/bash
var="$1"

if [[ -n $var ]]; then
  echo "「-n」で調べたところ、変数「var」は空ではありません"
else
  echo "「-n」で調べたところ、変数「var」は空です"
fi

これで、再度shellcheckコマンドで調べると、何も出力されなくなり、問題が解消したことが分かります。

$ shellcheck example.sh

実行してみると、次のように期待通り動作するようになっています。

$ bash example.sh
「-n」で調べたところ、変数「hoge」は空です
$ bash example.sh hoge
「-n」で調べたところ、変数「hoge」は空ではありません
$ bash example.sh ""
「-n」で調べたところ、変数「hoge」は空です

このように、シェルスクリプトがうまく動かない場合の原因調査に使えます。また、うまく動いていたとしても、バグをはらんでいると見られる場所を教えてくれるので、「シェルスクリプトを書いたら、まずはshellcheckコマンドにかける」ことを習慣にしておくと良いでしょう。