ShellCheckの警告を読んでみる

エキサイトの武藤です。

IntelliJシェルスクリプトを開くと、構文に警告を見かけることがあります。

IntelliJシェルスクリプトの構文警告

SC2006 のリンクは下記のページに遷移します。

github.com

ShellCheckは、シェルスクリプトの静的解析ツールです。 こちらにWikiが用意されており、具体的な問題とその理由、解決方法の説明があります。

今回は、その内容をいくつか紹介します。

ShellCheck とは

再度の説明になりますが、シェルスクリプトの静的解析ツールです。

シェルスクリプトの構文上の問題や意図しない挙動の可能性を警告してくれます。

github.com

IntelliJの他にもVimVSCode等の各種エディターからも利用できます。

警告の例

先程の警告が出たサンプルコードです。

get_day_of_week()
{
    DAY_OF_WEEK=`date '+%A'`
    echo $DAY_OF_WEEK
}

以下に警告を紹介します。

Use $(...) notation instead of legacy backticked

`date '+%A'`

上記のコードに下記の警告が表示されました。

Use $(...) notation instead of legacy backticked .... See SC2006.

github.com

バッククオートによるコマンド実行はレガシーな構文であり、いくつかの問題があります。

POSIXと呼ばれるUnix OS間の移植性に関する標準規格があります。 バッククオートには、POSIXのクオートに関連した未定義の動作があります。

また、バッククオートによって、エスケープが複雑になったり、ネストが困難になる問題があります。

下記のように修正します。

DAY_OF_WEEK=$(date '+%A')

Double quote to prevent globbing and word splitting.

echo $DAY_OF_WEEK

上記のコードに下記の警告が表示されました。

Double quote to prevent globbing and word splitting. See SC2086.

github.com

変数を扱う際に、ダブルクオートで囲うことで単語の分解、グロブ展開の防止ができます。

グロブ展開とは、ワイルドカード*, ?など)を使ったファイルパス展開のことです。

こちらはシンプルにダブルクオートで囲って修正します。

echo "$DAY_OF_WEEK"

終わりに

使い捨てシェルスクリプトなら問題ないですが、運用するコードの場合は構文にも注意したほうが良いでしょう。

長らく運用されいてるコードでは、レガシーな構文になっていることがありえますので、警告を元に正しく修正しましょう。

採用情報

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

www.wantedly.com

参考記事

github.com

atmarkit.itmedia.co.jp