シェルスクリプトの静的解析ツールShellCheckをDockerで動かす

こんにちは。エンジニアのまるりんです。

シェルスクリプトは気軽に書けるのが良い反面、正しい文法で書けているのか不安になったりしますね。 ShellCheckというツールを用いれば文法に問題がないかチェックできます。 今回は以下のスクリプトに対してチェックをかけてみます。

#!/bin/sh
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called ${USER_NAME}_file"
touch "${USER_NAME}_file"

ShellCheckはbrewでもインストールできるのですが、何やらビルドに時間がかかるようなのでDockerイメージを使用します。

$ docker run --rm -v "$PWD:/mnt" koalaman/shellcheck:stable user.sh

In user.sh line 3:
read USER_NAME
^--^ SC2162: read without -r will mangle backslashes.

For more information:
  https://www.shellcheck.net/wiki/SC2162 -- read without -r will mangle backs...

検査結果が出ました。readにrオプションをつけないとバックスラッシュを読み込めないようです。 ちなみに、koalaman/shellcheckイメージのWORKDIRが/mntのため当該ディレクトリに対してボリュームしています。

$ docker history koalaman/shellcheck:stable
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
3f2d7311f92e   4 months ago   ENTRYPOINT ["/bin/shellcheck"]                  0B        buildkit.dockerfile.v0
<missing>      4 months ago   COPY /bin/shellcheck /bin/ # buildkit           6.62MB    buildkit.dockerfile.v0
<missing>      4 months ago   WORKDIR /mnt                                    0B        buildkit.dockerfile.v0
<missing>      4 months ago   LABEL maintainer=Vidar Holen <vidar@vidarhol…   0B        buildkit.dockerfile.v0

readにrを追加し、再度チェックしてみます。

-read USER_NAME
+read -r USER_NAME
$ docker run --rm -v "$PWD:/mnt" koalaman/shellcheck:stable user.sh

メッセージが表示されなくなったのでスクリプトに(少なくとも文法上は)問題ないことが示されました。