30
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

bashで[ -v "$VAR" ]を使わずに変数が未定義か判定する

変数が未定義かどうか知りたい!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}" ]で判断できるというわけです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
30
Help us understand the problem. What are the problem?