例えば、rm -rf ${STR}/
とスクリプトを書いた時に${STR}
が空だったら大惨事世界大戦になるのでそれを防ぎたい。
現状確認
以下のようにしていると、${STR}
が空の時でもエラーとならない
test.sh
# !/bin/bash
STR="test"
unset STR
echo ${STR}/
$ bash test.sh
変数展開
以下の${STR:?}/
のようにシェルスクリプトの変数展開を用いると、${STR}
が空の場合にエラーを返す
test.sh
# !/bin/bash
STR="test"
unset STR
echo ${STR:?}/
$ bash test.sh
test.sh: line 6: STR: parameter null or not set
シェルの設定を変更
変数が多い時、エラー処理として全ての変数に変数展開を用いるのは大変なので、シェルの設定を変更したい。
set
コマンドで、設定していない変数があったらエラーとする。
set -u
をスクリプトのはじめに付ければ良いだけでとてもシンプル。
test.sh
# !/bin/bash
set -u
# set -euo pipefail 指定でよく使われる
# -e errexit: パイプやサブシェルで実行したコマンドが1つでもエラーになったら直ちにシェルを終了する
# -u nounset: パラメーター展開中に、設定していない変数があったらエラーとする(特殊パラメーターである「@」と「*」は除く)
# pipefail パイプラインの返り値を、最後のエラー終了値(0以外で終了した際の値、全ての実行が成功した場合は0)にする
STR="test"
unset STR
echo ${STR}/
$ bash test.sh
test.sh: line 6: STR: unbound variable
set -euo pipefail
指定でよく使われる。当分はこれを使うことにします。
(新規作成の場合はこれで良さそうだが、スクリプト保守時はset -u
を加えた際の影響範囲が大きいかもしれないので、変数展開と使い分ける。)
参考
【シェル芸人への道】Bashの変数展開と真摯に向き合う
シェルスクリプトマナー
【 set 】コマンド――シェルの設定を確認、変更する