「if」文に変数があるかどうかを確認するには?

「if」文に変数があるかどうかを確認するには?

文に変数があることを確認する必要がありますif。いくつかの効果:

if [ -v $somevar ]
then
    echo "Variable somevar exists!"
else
    echo "Variable somevar does not exist!"

最も近い質問はこれ、実際に私の質問に答えません。

答え1

最新のbash(4.2以上):

[[ -v name_of_var ]]

からhelp test

-v VAR、シェル変数VARが設定されている場合はtrue

答え2

何を意味するかによって異なります存在する

変数が宣言されたが値が割り当てられていないかどうか存在する

空のリストが割り当てられた配列(またはハッシュ)変数かどうか。存在する

nameref変数が現在割り当てられていない変数を指しているかどうか存在する

$-、、$#変数を検討していますか$1? (POSIXはそうではありません)。

Bourneのようなシェルでは、標準的な方法は次のとおりです。

if [ -n "${var+set}" ]; then
  echo '$var was set'
fi

これは、スカラー変数やその他のパラメータに対して変数に値が割り当てられているかどうか(環境、割り当てなどでread自動的にnullまたはnull以外の値for)を決定するために使用されます。

typesetまたは、コマンドを含むシェルの場合、declare次のように報告されません。置くすでに存在する変数発表するしかし、分散(では、zsh変数を宣言すると値が割り当てられ、指定されていない場合はデフォルト値が割り当てられます。)

配列をサポートするシェルの場合(および次のようには報告されませyashん)zsh置くインデックス0の要素が設定されていない場合の配列変数です。

for bashksh93norではないzsh)、型変数用連想配列、これは次のように報告されません。置くキー「0」が設定されていない要素です。

ksh93およびbash型変数の場合名前参照、nameref自体が参照する変数が考慮されている場合にのみtrueを返します。置く

kshzshおよびの場合、bashより良いアプローチは次のとおりです。

if ((${#var[@]})); then
  echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi

ksh93および4.4以降zshには以下もbashあります。

if typeset -p var 2> /dev/null | grep -q '^'; then
  echo '$var exists'
fi

設定または宣言された変数を報告します。

答え3

答えで述べたようにだから、確認する方法は次のとおりです。

if [ -z ${somevar+x} ]; then echo "somevar is unset"; else echo "somevar is set to '$somevar'"; fi

ここで、$ {somevar + x}はパラメータ拡張で、varが設定されていない場合はnullと評価され、そうでない場合は文字列 "x"が置き換えられます。

-n他の答えが提案したように、 using は変数に空の文字列が含まれているかどうかを確認します。存在するかどうかを確認しません。

答え4

if set|grep '^somevar=' >/dev/null;then
    echo "somevar exists"
else
    echo "does not exist"
fi

関連情報