bashを利用する場合には、オプション-uを必須にしている人も多いと思います。
たまに、変数が未定義であるかどうかを確認する処理を書きたくなることがある。
一時的にオプション-uをOFFにするなど、方法はいろいろありますが、testコマンドで実現したかった。
結論から言うと、testコマンドのオプション-vで実現できた。
-v varname シェル変数 varname がセットされている (値が代入されている) ならば真となります。
#!/bin/bash -u
# -vオプションを利用した未定義確認
if [ -v VAR ];then
echo "Y" # VAR変数は定義済み
else
echo "N" # VAR変数は未定義
fi
VAR="value"
# -vオプションを利用した未定義確認
if [ -v VAR ];then
echo "Y" # VAR変数は定義済み
else
echo "N" # VAR変数は未定義
fi
ただ、bashのバージョン次第ではtestオプション-vをサポートしていないこともある。
testオプション-zあたりを使えば、未定義もしくはから文字列の判定ができるが、bashオプション-uを定義しているとそれができない。
そのため、パラメータの展開を利用して実現してみた。
パラメータの展開
(中略)
部分文字列展開以外の場合、以下の形式で、 bash はパラメータが設定されているか、空ではないかを調べます。
コロンを省略した場合には設定されているかどうかのみを調べます。${parameter:-word}
デフォルトの値を使います。
parameterが設定されていないか空文字列であれば、wordを展開したものに置換されます。
そうでなければ、 parameter の値に置換されます。
パラメータ展開は使ってはいたもののmanで調べたことがなかったため、見てみるとなかなか面白い。
"${VAR-UNDEF}" = "UNDEF"
で済ませるケースも見ますが、それでは実際にUNSETが代入されていた場合と違いが付かない。
そこで、2回別変数でチェックすれば未定義確認は可能になる。
# ただスマートさに欠ける。。。
#!/bin/bash -u
# パラメータ展開を利用の未定義確認
if [ "${VAR-A}" = "A" ] && [ "${VAR-B}" = "B" ];then
echo "N" # VAR変数は未定義
else
echo "Y" # VAR変数は定義済み
fi
VAR="value"
# パラメータ展開を利用の未定義確認
if [ "${VAR-A}" = "A" ] && [ "${VAR-B}" = "B" ];then
echo "N" # VAR変数は未定義
else
echo "Y" # VAR変数は定義済み
fi
ちゃんと調べてみると、以下のパラメータ展開があった。
${parameter:+word}
別の値を使用します。 parameter が空文字列または設定されていなければ、空文字列に置換されます。 そうでなければ
word を展開したものに置換されます。
つまりは、変数が空文字列、もしくは未定義ならば空文字列を、それ以外ならばwordを展開してくれるというもの。
オプション-zで返ってくる値が空文字列かをチェックすれば良い。
うん、スマートになりました。
#!/bin/bash -u
# パラメータ展開を利用の未定義確認
if [ -z "${VAR+UNDEF}" ];then
echo "N" # VAR変数は未定義
else
echo "Y" # VAR変数は定義済み
fi
VAR="value"
# パラメータ展開を利用の未定義確認
if [ -z "${VAR+UNDEF}" ];then
echo "N" # VAR変数は未定義
else
echo "Y" # VAR変数は定義済み
fi