-1

私は配列を持っています:

arr=($A $B)

A と B の両方が存在することを確認したい。これどうやってするの?配列宣言の前にすべての要素を手動でチェックせずに?

4

4 に答える 4

3

設定されていない可能性のあるシェル変数を展開する場合、次のオプションがあります。設定されていない値をデフォルトに置き換えることができます。変数をデフォルトに設定してから置き換えることができます。または、エラーを発生させることができます。

bashマニュアルの詳細は次のとおりです。

${parameter:-word}
デフォルト値を使用します。パラメータが設定されていないか null の場合、単語の展開が置換されます。それ以外の場合は、パラメーターの値が代入されます。

${parameter:=word}
デフォルト値を割り当てます。パラメータが設定されていないか null の場合、単語の展開がパラメータに割り当てられます。その後、パラメータの値が代入されます。定位置パラメーターと特殊パラメーターは、この方法では割り当てられない場合があります。

${parameter:?word}
Null または未設定の場合はエラーを表示します。パラメータが null または設定されていない場合、単語の展開 (または単語が存在しない場合はその旨のメッセージ) が標準エラーに書き込まれ、対話型でない場合はシェルが終了します。それ以外の場合は、パラメーターの値が代入されます。

したがって、エラーを発生させたい場合、最も簡単な使用方法は次のとおりです。疑問符の後にカスタム メッセージを追加できます。

% echo ${UNSET?}
-bash: UNSET: parameter null or not set
于 2013-10-14T15:03:11.280 に答える
2

必要なものによっては、 と のデフォルト値を指定するだけで十分な場合がありますAB

arr=("${A:-one}" "${B:-two}")
于 2013-10-14T15:02:03.153 に答える
0
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
于 2013-10-14T15:21:48.500 に答える
0

設定されていない変数の使用時にエラーを生成するためのシェル オプションがありますが、ユース ケースには一般的すぎる可能性があります。

$ set -u
$ A=6
$ arr=($A $B)
bash: B: unbound variable
于 2013-10-14T16:18:25.803 に答える