1. ホーム
  2. bash

[解決済み] Bashシェルスクリプトで文字列が定義されていないかどうかを判断する方法

2022-04-29 23:39:39

質問

ヌル文字列をチェックしたい場合は、次のようにします。

[ -z $mystr ]

が、変数が全く定義されていないかどうかを確認したい場合はどうすればいいのでしょうか?それとも、Bashスクリプトでは区別がないのでしょうか?

どのように解決するのですか?

あなたが求めている答えは、(明記されていないとしても)次のように暗示されていると思います。 ビンコ 's 答え とはいえ、簡単に綴られているわけではありません。 VARがセットされているが空なのか、セットされていないのかを見分けるには。

if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi

おそらく、2行目の2つのテストを1つにまとめることができます。

if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi

しかし、Autoconf のドキュメントを読むと、'' と '' を組み合わせた用語は推奨されていないことがわかります。 -a を使用することを推奨しています。 && . 問題があるシステムには出会ったことがありません。だからといって、昔は存在しなかったわけではありません(しかし、遠い昔はそうでもなかったとしても、最近では極めて稀な存在でしょう)。

これらの詳細や、その他の関連する情報については シェルパラメータ拡張 をご覧ください。 test または [ コマンドと 条件式 をBashのマニュアルに記載しています。


先日、この回答についてメールで質問と一緒に質問されました。

2つのテストを使っていますが、2つ目のテストはよくわかりますが、1つ目のテストはわかりません。正確には、変数展開の必要性がわからない。

if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi

これでも同じことが実現できるのでは?

if [ -z "${VAR}" ]; then echo "VAR is not set at all"; fi

公平な質問ですが、答えは「いいえ、あなたのよりシンプルな代替案は同じことをしません」です。

あなたのテストの前に、私がこれを書いたとしましょう。

VAR=

あなたのテストでは "VAR is not set at all" と言いますが、私のテストでは(何も反響しないので暗に) "VAR is set but its value might be empty" と言うでしょう。 このスクリプトを試してみてください。

(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo "JL:1 VAR is not set at all"; fi
if [ -z "${VAR}" ];     then echo "MP:1 VAR is not set at all"; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo "JL:2 VAR is not set at all"; fi
if [ -z "${VAR}" ];     then echo "MP:2 VAR is not set at all"; fi
)

と出力されます。

JL:1 VARが全く設定されていない
MP:1 VARが全く設定されていない
MP:2 VARは全く設定されていない

2つ目のテストの組では、変数は設定されていますが、空の値に設定されています。 この区別は ${VAR=value}${VAR:=value} という表記になります。 同様に ${VAR-value}${VAR:-value} および ${VAR+value}${VAR:+value} といった具合に。


として ギリ の中で指摘しています。 回答 を実行すると bash と共に set -o nounset というオプションがある場合、上記の基本的な回答は失敗します。 unbound variable . 簡単に改善することができます。

if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi

をキャンセルすることもできます。 set -o nounset オプションで set +u ( set -u と同等である。 set -o nounset ).