set -uしてるときに変数が定義されてるかチェックする

More than 3 years have passed since last update.

いつもシェルスクリプトを書くときは未定義だろうが気にせず使って空文字かどうかで判定してたので、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

よかったよかった。


読むがよい

よく使ふツールのマニュアルはよく読んでおけってことですね(教訓)