ORゲートを使用した単一のif文シェルスクリプトの複数の文字列の比較

ORゲートを使用した単一のif文シェルスクリプトの複数の文字列の比較

変数に格納されている文字列を3つの異なる文字列と比較しようとしていますが、どちらも一致しないとエラーが発生します。論理演算子ORを使用して単一のifステートメントでこれを実行しようとしています。ちなみに、変数に格納されている値が可能な値のいずれかに等しくても、エラーが発生するたびにエラーが発生します。私が試したスニペットを見つけてください。

if [[ "$TYPE" != "LOCAL" || "$TYPE" != "REMOTE" || "$TYPE" != "BOTH" ]]; then
    echo -e "\n\tINCORRECT OR NULL ARGUMENTS PASSED. PLEASE VERIFY AND CORRECT THE USAGE MENTIONED AS BELOW: \n"
    Usage
    exit 1
fi


if [[ "$TYPE" != "LOCAL" ]] || [["$TYPE" != "REMOTE" ]] || [["$TYPE" != "BOTH" ]]; then
    echo -e "\n\tINCORRECT OR NULL ARGUMENTS PASSED. PLEASE VERIFY AND CORRECT THE USAGE MENTIONED AS BELOW: \n"
    Usage
    exit 1
fi

答え1

あなたの論理はあなたの後ろにあります。すべての文字列は次のように異なることが保証されます。LOCAL またはREMOTE文字列はandにはできないため異なりますLOCALREMOTE

ここで作業を実行するのに適したツールはステートメントですcase(これはksh演算子shとは逆の標準構文です[[...]])。

case $TYPE in
  (REMOTE|LOCAL|BOTH) ;; # OK
  (*) printf >&2 'Error...\n'; exit 1;;
esac

シミュレーションで[[またはkshを使用するには、bash次のようにします。zshksh

if [[ $TYPE != @(REMOTE|LOCAL|BOTH) ]]; then
  printf >&2 'Error...\n'
  exit 1
fi

または[[ $TYPE != REMOTE && $TYPE != LOCAL && $TYPE != BOTH ]]など[[ ! ($TYPE = REMOTE || $TYPE = LOCAL || $TYPE = BOTH) ]]

または標準[コマンドを使用してください[ "$TYPE" != REMOTE ] && [ "$TYPE" != LOCAL ] && [ "$TYPE" != BOTH ]

ksh93bashまたはの場合のもう1つzshのオプションは、連想配列を使用することです。

typeset -A allowed_TYPE
allowed_TYPE=([REMOTE]=1 [LOCAL]=1 [BOTH]=1)
if ((!allowed_TYPE[\$TYPE])); then
  printf >&2 'Error...\n'
  exit 1
fi

任意のコマンド実行の脆弱性が発生しないようにするには、inが\重要です。\$TYPE)。

Passを使用すると、 zsh通常の配列を使用することもできます。

 allowed_TYPE=(REMOTE LOCAL BOTH)
 if ((! $allowed_TYPE[(Ie)$TYPE]))...

関連情報