駅メモ!チームエンジニアの id:Eadaeda です。
みなさんシェルスクリプト書いてますか?私は時々書いています。12/2 の記事ではシェルスクリプトのテストを書いてみませんかという話を書きました。
今回はテストではなく、linter の話です。
シェルの文法はなかなか難しいです。例えばダブルクォートで括るかどうかなどです。
# スクリプト a.sh があるとして $ cat ./a.sh #!/bin/bash echo "[$1]" "[$2]" "[$3]" "[$4]" "[$5]" "[$6]" # 例:引数のコマンド置換をダブルクォートで括るかどうかで動作が変わる $ ./a.bash $(date) [Wed] [Nov] [30] [17:06:59] [JST] [2022] $ ./a.bash "$(date)" [Wed Nov 30 17:07:10 JST 2022] [] [] [] [] []
こういった慣れてないと陥りやすい罠はどんなものにもありますが、linter があれば先に気づくことができそうですね。
シェルスクリプトの linter
今回はShellCheckを linter として使っていきます。例えば先の a.sh
を実行するだけのスクリプトb.sh
を以下のように書いたとします。
#!/bin/bash ./a.sh $(date)
これをshellckeck
にかけると…。
$ shellcheck b.sh In b.bash line 3: ./a.sh $(date) ^-----^ SC2046 (warning): Quote this to prevent word splitting. For more information: https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
こんな感じで警告してくれます。かんたんな対処方法が書かれていますね。より詳しい内容が知りたい場合は、同時に出力されている URL にアクセスするか、SCxxxx
で gg れば該当のページを探すことができます。
自分はそこそこチェックをするようにしています。意図しない罠を回避したいのもモチベですが、「ええっ!こんな罠が!?」と勉強にもなるのでハッピーです。
まとめ
今回は ShellCheck をかんたんに紹介しました。ぜひお手持ちのシェルスクリプトで試してみてくださいね。