24
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-07-06

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

24
31
8

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
24
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?