いつもシェルスクリプトを書くときは未定義だろうが気にせず使って空文字かどうかで判定してたので、set -u
な環境下でスクリプトを書いてるときに嵌った。
対処
Bash Reference Manual: Bash Conditional Expressionsにちゃんと書いてあった。
-v varname
- True if the shell variable varname is set (has been assigned a value).
なるほど。
サンプルコード
だめ
error.sh
#!/bin/bash
set -x # デバッグ用に冗長に出力する
set -u # 未定義変数をエラーにする
if [[ $FOO ]]; then echo y; else echo n; fi
+ set -u
./error.sh: line 6: FOO: unbound variable
いつもだとこれで動くんだけどなあ… と、良くない習慣。
よい
correct.sh
#!/bin/bash
set -x # デバッグ用に冗長に出力する
set -u # 未定義変数をエラーにする
# 未定義なのでnを通る
if [[ -v FOO ]]; then echo y; else echo n; fi
# 定義する
FOO="foo"
# 定義されてるのでyを通る
if [[ -v FOO ]]; then echo y; else echo n; fi
+ set -u
+ [[ -v FOO ]]
+ echo n
n
+ FOO=foo
+ [[ -v FOO ]]
+ echo y
y
超いい感じですね。当然だけど set -u
してないときもちゃんと動くよ。
具体例
# Jenkins実行時以外に実行したい初期化処理を書く
if [[ ! -v JENKINS_HOME ]]
then
...
fi
よかったよかった。
読むがよい
よく使ふツールのマニュアルはよく読んでおけってことですね(教訓)