最初は、
if [ "${VAR:-UNDEF}" = "UNDEF" ] ; then ... fiだろうかと思ったのですが、VAR="" の時も真となってしまうので、微妙に違いました。それと、実際には無いはずとしても VAR="UNDEF" だったら、意図しない状況になってしまうのが引っかかります。処理内容によってはセキュリティホールのタネにもなるのではないか。
書籍調査/ネット検索の末に、
if ! set | grep -m 1 -q ^VAR= ; then ... # VARが未定義の場合に行う処理を記述 fiとするしかなさそうなのですが、もっとエレガントな方法は無いものでしょうかね。現在のマシンでは大した処理コストではないですが、目的に対しては仰仰しいと思いました。
bash にそういった機能(isset のような)があったらいいように思いますが、需要がほとんどないし不要ということだろうか。
2014-05-10追記
匿名様(コメント参照)から情報頂き、
if [ -z "${VAR+x}" ] ; then # VARが定義済み(nullを含む)の場合 x が返るので、-z でテストすれば OK ... # VARが未定義の場合に行う処理を記述 fiと書けると知りました。少々難しい(慣れの問題?)ですが、手短に書けて良いでね。
2014-05-17追記
RHEL7.0 RC を調べていて、[ -v VAR ] が追加されているのを見つけました。
[root@hoge ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.0 (Maipo) [root@hoge ~]# bash --version GNU bash, バージョン 4.2.45(1)-release (x86_64-redhat-linux-gnu) ... [root@hoge ~]# help test ... Other operators: -o OPTION True if the shell option OPTION is enabled. -v VAR True if the shell variable VAR is set ...bash の CHANGES を確認してみると、バージョン 4.2 で追加されたようです。
------------------------------------------------------------------------------ This document details the changes between this version, bash-4.2-alpha, and the previous version, bash-4.1-release. ... 3. New Features in Bash ... f. test/[/[[ have a new -v variable unary operator, which returns success if `variable' has been set. ...いちおう動作確認です。
[root@hoge ~]# VAR="set" ; [ -v VAR ] ; echo $? 0 [root@hoge ~]# unset VAR ; [ -v VAR ] ; echo $? 1RHEL6/CentOS6 以下の bash では使えないので、当面は利用できないですが、メモまで。
つ [ -z "${VAR+x}" ]
返信削除匿名様
削除情報ありがとうございます。教えてもらった書き方で、期待の動作になりました! 感謝です
if [ "${VAR-UNDEF}" = "UNDEF" ]; then
返信削除というのはいかがでしょう?