LoginSignup
14
12

More than 5 years have passed since last update.

bashオプション-uを付けた状態での未定義変数チェック方法

Posted at

bashを利用する場合には、オプション-uを必須にしている人も多いと思います。
たまに、変数が未定義であるかどうかを確認する処理を書きたくなることがある。
一時的にオプション-uをOFFにするなど、方法はいろいろありますが、testコマンドで実現したかった。

結論から言うと、testコマンドのオプション-vで実現できた。

   -v varname
         シェル変数 varname がセットされている (値が代入されている) ならば真となります。
unset_var_check_sample1.sh
#!/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回別変数でチェックすれば未定義確認は可能になる。
# ただスマートさに欠ける。。。

unset_var_check_sample2.sh
#!/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で返ってくる値が空文字列かをチェックすれば良い。
うん、スマートになりました。

unset_var_check_sample3.sh
#!/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
14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12