goodbyegangsterのブログ

備忘録的な

シェルスクリプトのコードレビュー時のメモ

シェルスクリプトをコードレビューする時の便利な方法をメモ。

以下が今回サンプルとして利用したスクリプトです。

sample.sh

#!/bin/sh

var=0
while [ $var -lt 3 ]
do
        echo $var
        var=`expr $var + 1`
done

文法チェック

-n オプションを利用すると、処理は実行されず、Syntax errorを見つけてくれます。

$sh -nv sample.sh

エラーがある時は、こんな感じで出力されます。

$ sh -nv ./sample_error.sh
#!/bin/sh

var=0
while [ $var -lt 3 ]
do
        echo $var
        var=`expr $var + 1`
doen
./sample_error.sh: 9: ./sample_error.sh: Syntax error: end of file unexpected (expecting "done")

サンプルはshですが、bashでも同じです。

デバッグ表示

-x オプションを利用すると、処理された内容をそのまま表示してくれます。

$ sh -xv sample.sh
#!/bin/sh

var=0
+ var=0
while [ $var -lt 3 ]
do
        echo $var
        var=`expr $var + 1`
done
+ [ 0 -lt 3 ]
+ echo 0
0
+ expr 0 + 1
+ var=1
+ [ 1 -lt 3 ]
+ echo 1
1
+ expr 1 + 1
+ var=2
+ [ 2 -lt 3 ]
+ echo 2
2
+ expr 2 + 1
+ var=3
+ [ 3 -lt 3 ]

サンプルはshですが、bashでも同じです。

Linterの利用

shellcheck を使うと良さげでした。下記はgithubのページ。

github - shellcheck

各プラットフォーム向けにパッケージが用意されているので、パッケージからインストールできます。以下はUbuntuでの実行例。

$ sudo apt-get install shellcheck

確認したスクリプトを渡してコマンドを実行すると、問題点を指摘してくれます。

$ shellcheck sample.sh

In sample.sh line 7:
        var=`expr $var + 1`
            ^-- SC2006: Use $(..) instead of legacy `..`.
             ^-- SC2003: expr is antiquated. Consider rewriting this using $((..)), ${} or [[ ]].

Shellcheckを実行できるWEBページも用意されており、フォームに検証したいスクリプトを貼り付けると、問題点を指摘してくれます。

f:id:goodbyegangster:20200108064411p:plain

shellcheck.net

WEBの場合、指摘されたメッセージをクリックすると詳細ページにリンクしてくれるので、確認だけであれば、こっちのほうが使いやすいです。


最後に、実際に修正したスクリプトです。

#!/bin/sh

var=0
while [ $var -lt 3 ]
do
    echo $var
    var=$((var + 1))
done