ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Shellcheckを使ってBashスクリプトのチェックと最適化

(2023-01-29 初稿 )

はじめに

筆者は、Bashスクリプトをよく利用しているが、その独自の記述方法のためにエラーが起きたり、思いどおりに動作させられないことがしばしばある。

最近、ネットで shellcheck のことを知り、シェルスクリプトの強力な助っ人になりそうなことがわかった。本記事では、ShellCheckの主な機能とインストールと簡単な使い方を紹介する。

 ShellCheckとは

ホームページによれば、初心者から上級者までのレベルに応じたコード品質やバグの指摘を目的とするツール。オープンソースで無料であるため、shellのlintとしては、最も人気がある。

筆者は、主にシンタックスの確認、コードの最適化のために用いようと思っている。

インストールと使い方

インストール

ShellCheckのインストールは、Debian/Ubuntuであれば、以下のとおり簡単にインストールできる。

$ sudo apt-get install shellcheck

使い方

以下のように、shellスクリプトをチェックすることができる。

$ shellcheck your_script.sh

エラーの検索と対策

例えば、複数のエラーを含む以下のスクリプトを作成する。

#!/usr/bin/bash
num=2
[[ $# -ne $num ]] && {echo "error"; exit}

上記スクリプトを、shellcheckすると以下のようにエラーコードが示される。

$ shellcheck example 
In example line 4:
[[ $# -ne $num ]] && {echo "error"; exit}
                     ^-- SC1073 (error): Couldn't parse this brace group. Fix to allow more checks.
                      ^-- SC1054 (error): You need a space after the '{'.
                                        ^-- SC1083 (warning): This } is literal. Check expression (missing ;/\n?) or quote it.

In example line 5:
^-- SC1056 (error): Expected a '}'. If you have one, try a ; or \n in front of it.
^-- SC1072 (error): Missing '}'. Fix any mentioned problems and try again.

For more information:
  https://www.shellcheck.net/wiki/SC1054 -- You need a space after the '{'.
  https://www.shellcheck.net/wiki/SC1056 -- Expected a '}'. If you have one, ...
  https://www.shellcheck.net/wiki/SC1083 -- This } is literal. Check expressi...

今回のエラーは、{}の前後のspaceが足りないのと、{}内の「;(セミコロン)」が足りないだけなので、エラーの原因は調べるまでもないが、上記に記述があるとおり、例えば  https://www.shellcheck.net/wiki/SC1056 をネットで検索すると、原因とその対策まで示してくれる。

エラーの検索

対策まで示してくれるから、とっても便利。

念の為に書くが、以下のように修正すれば、エラーが出なくて正常動作する。

[[ $# -ne $num ]] && { echo "error"; exit; }

この他、-i や -e オプションを付けることによって、以下のことができる。

  • -i オプション: みたいエラーコードを指定する。
  • -e オプション: あまりにたくさんのエラーが出るときに、指定するエラー出力を除く

おわりに

ShellCheckはshellスクリプト開発者の頼りになるツールで、お役に立つことができると思われる。筆者も、これから自分のshellスクリプトをcheckして、できるだけ有益なスクリプトを作りたいなぁ…(希望的観察)。

関連ページ