簡単に説明されていませんが、あなたの回答はVinkoの回答に含まれています(明記されていない場合)。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
or[
コマンド、条件式は、Bashのマニュアルに記載されています。
私は最近、この回答についてメールで質問されました:
あなたは2つのテストを使用し、私は2番目のテストをよく理解していますが、最初のテストは理解していません。より正確には、変数展開の必要性を理解していません
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は設定されていません」と表示されますが、私は(暗黙的に何もエコーしないため)、「VARは設定されていますが、値が空である可能性があります」と表示します。このスクリプトを試してください:
(
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 is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
テストの2番目のペアでは、変数は設定されていますが、空の値に設定されています。これは、${VAR=value}
および${VAR:=value}
表記法による区別です。${VAR-value}
and ${VAR:-value}
、および${VAR+value}
and などの同上${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
)でオプションをキャンセルできます。