変数に格納されている文字列を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にはできないため異なりますLOCAL
。REMOTE
ここで作業を実行するのに適したツールはステートメントですcase
(これはksh演算子sh
とは逆の標準構文です[[...]]
)。
case $TYPE in
(REMOTE|LOCAL|BOTH) ;; # OK
(*) printf >&2 'Error...\n'; exit 1;;
esac
シミュレーションで[[
またはksh
を使用するには、bash
次のようにします。zsh
ksh
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 ]
。
ksh93
、bash
またはの場合のもう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]))...