変数が未定義かどうか知りたい!test
コマンドに-v
ってオプションがあるらしい!test
コマンド最高!
と思って実行したらbashが古くて-v
非対応でした。代替案をつくらざるをえない。
結論&解説(2020/02/13更新)
@mattintosh4 さんからコメントを頂きまして、記事を書き直しました。
読みやすさを優先して、古い記事はバッサリ削除してしまいました。ご了承ください。
結論
以下が真ならVAR
は定義済みまたは空文字列、偽なら未定義です。
[ "${VAR+foo}" ]
空文字列の場合も偽として扱いたい場合は、
以下が真ならVAR
は定義済み、偽なら未定義または空文字列です。
[ "${VAR:+foo}" ]
解説
bashのパラメータ展開を使います。
Man pageの記述では以下になります。
部分文字列展開以外の場合、以下の形式で、 bash はパラメータが設定されているか、空ではないかを調べます。 コロンを省略した場合には設定されているかどうかのみを調べます。
${parameter:+word}
別の値を使用します。 parameter が空文字列または設定されていなければ、空文字列に置換されます。 そうでなければ word を展開したものに置換されます。
パラメータ展開の指定方法と展開結果は以下の通りです。
指定 | VAR=bar |
VAR= |
unset VAR |
説明 |
---|---|---|---|---|
"${VAR+foo}" |
'foo' |
'foo' |
'' |
VAR が未定義なら空文字、そうでなければfoo になる |
"${VAR:+foo}" |
'foo' |
'' |
'' |
VAR が空文字列または未定義なら空文字、そうでなければfoo になる |
[ '' ]
は偽となるので、[ "${VAR+foo}" ]
や[ "${VAR:+foo}" ]
で判断できるというわけです。