目的
変数で変数を定義したいことがあります。これを参照変数と呼ぶとすると、元の変数で参照先の変数が設定されているかを判定できるか?の記事です。
探してもすぐに出てこなかったので自分で試しました。
環境
bash --version
GNU bash, バージョン 5.1.0(1)-release (x86_64-apple-darwin18.7.0)
...
変数の値に変数名の定義
# 変数hogeの値はfooでこれが変数名になっている
hoge=foo
# 2つ目の変数(foo)を参照変数と呼ぶことにします。
foo=bar
# hogeから参照変数(foo)の値にアクセスする
## 方法1
eval echo '$'$hoge # -> boo
## 方法2
echo ${!hoge} # -> boo
参照変数(foo)に値がない場合の振る舞い
# 変数のクリア
unset foo
# 未定義変数でエラーとする
set -u
echo ${!hoge} # -> -bash: !hoge: 未割り当ての変数です
# scriptで組んでいると止まってしまいます。
参照変数の判定
bashには[ -z ${hoge} ]とかが出てくるのですが、参照された変数が未定義かどうかわかりませんでした。少なくとも[ -z ${!hoge} ]ではうまくいきません。
そこでbashの-vオプションを使います。
unset foo
# 変数(hoge)の設定判定は$なしの変数名(hoge)でチェックします
[ -v hoge ] && echo 'Y' || echo 'N' # -> Y
# 変数(hoge)の値が示す参照変数(foo)の設定判定は$ありの変数名($hoge)でチェックします
[ -v $hoge ] && echo 'Y' || echo 'N' # -> N
# 再設定します。
foo=bar
[ -v $hoge ] && echo 'Y' || echo 'N' # -> Y
# できました。
結論
bashの-vのオプションで$hogeで参照変数の設定判定ができました。
どなたかのお役に立てれば嬉しいです。
↧