私は配列を持っています:
arr=($A $B)
A と B の両方が存在することを確認したい。これどうやってするの?配列宣言の前にすべての要素を手動でチェックせずに?
設定されていない可能性のあるシェル変数を展開する場合、次のオプションがあります。設定されていない値をデフォルトに置き換えることができます。変数をデフォルトに設定してから置き換えることができます。または、エラーを発生させることができます。
bashマニュアルの詳細は次のとおりです。
${parameter:-word}
デフォルト値を使用します。パラメータが設定されていないか null の場合、単語の展開が置換されます。それ以外の場合は、パラメーターの値が代入されます。
${parameter:=word}
デフォルト値を割り当てます。パラメータが設定されていないか null の場合、単語の展開がパラメータに割り当てられます。その後、パラメータの値が代入されます。定位置パラメーターと特殊パラメーターは、この方法では割り当てられない場合があります。
${parameter:?word}
Null または未設定の場合はエラーを表示します。パラメータが null または設定されていない場合、単語の展開 (または単語が存在しない場合はその旨のメッセージ) が標準エラーに書き込まれ、対話型でない場合はシェルが終了します。それ以外の場合は、パラメーターの値が代入されます。
したがって、エラーを発生させたい場合、最も簡単な使用方法は次のとおりです。疑問符の後にカスタム メッセージを追加できます。
% echo ${UNSET?}
-bash: UNSET: parameter null or not set
必要なものによっては、 と のデフォルト値を指定するだけで十分な場合がありますA
。B
arr=("${A:-one}" "${B:-two}")
unset A B
arr=("$A" "$B")
set | grep ^arr=
arr=([0]="" [1]="")
わかりましたので、ループを使用してすべての値を確認できます。
for ((_i=0;_i<${#arr[@]};_i++));do
[ -n "${arr[_i]}" ] || {
printf -v _v %03o $((65+_i))
printf "empty $%b\n" \\$_v
}
done
empty $A
empty $B
A="aa bb"
arr=("$A" "$B")
set | grep ^arr=
arr=([0]="aa bb" [1]="")
for ((_i=0;_i<${#arr[@]};_i++));do
[ -n "${arr[_i]}" ] || {
printf -v _v %03o $((65+_i))
printf "empty $%b\n" \\$_v
}
done
empty $B
設定されていない変数の使用時にエラーを生成するためのシェル オプションがありますが、ユース ケースには一般的すぎる可能性があります。
$ set -u
$ A=6
$ arr=($A $B)
bash: B: unbound variable