PHONE_TYPE
変数に3つの有効な値のいずれかが含まれていることを確認したいと思います。
if [ "$PHONE_TYPE" != "NORTEL" ] || [ "$PHONE_TYPE" != "NEC" ] ||
[ "$PHONE_TYPE" != "CISCO" ]
then
echo "Phone type must be nortel,cisco or nec"
exit
fi
上記のコードは私には適していないので、次のように試しました。
if [ "$PHONE_TYPE" == "NORTEL" ] || [ "$PHONE_TYPE" == "NEC" ] ||
[ "$PHONE_TYPE" == "CISCO" ]
then
: # do nothing
else
echo "Phone type must be nortel,cisco or nec"
exit
fi
この種のタスクを実行するためのよりきれいな方法はありますか?
答え1
私はあなたが探していると思います:
if [ "$PHONE_TYPE" != "NORTEL" ] && [ "$PHONE_TYPE" != "NEC" ] &&
[ "$PHONE_TYPE" != "CISCO" ]
これらの等価物の規則を次のように呼びます。ドモーガンの法則あなたの場合は、次のことを意味します。
not(A || B || C) => not(A) && not(B) && not (C)
ブール演算子またはand andの変更を確認してください。
そしてあなたはこれをやろうとしています:
not(A || B || C) => not(A) || not(B) || not(C)
これは明らかに動作しません。
答え2
Bashを使用する場合、より短い方法は次のとおりです。
if [[ ! $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO)$ ]]; then
echo "Phone type must be nortel, cisco or nec."
fi
^
– 行の先頭に一致します。$
– 行末の一致=~
- Bashに組み込まれた正規表現比較演算子
答え3
素晴らしい答えと貴重な教訓です。 ;) メモを追加したかった。
使用するテストの種類の選択は、主にコード、構造、環境などによって異なります。
別の方法は、次のスイッチまたはcase
ステートメントを使用することです。
case "$PHONE_TYPE" in
"NORTEL"|"NEC"|"CISCO")
echo "OK"
;;
*)
echo "Phone type must be nortel,cisco or nec"
;;
esac
2番目の注意点は、大文字の変数名を使用するときに注意する必要があることです。これは、ほぼ常に大文字のシステムによって導入された変数間の衝突を防ぐためです。だから$phone_type
代わりに$PHONE_TYPE
。
これは安全ですが、すべて大文字を使用する習慣がある場合は、いつか傷ついた世界にいるとIFS="boo"
言うことができます。
また、どちらがどれであるかをより簡単に見つけることができます。
一つでもない〜しなければならないしかし、Aはそれを強く考慮します。
また、関数の良い候補かもしれません。これは主にコードを読みやすく保つのが簡単です。たとえば、
valid_phone_type()
{
case "$1" in
"NORTEL"|"NEC")
return 0;;
*)
echo "Model $1 is not supported"
return 1;;
esac
}
if ! valid_phone_type "$phone_type"; then
echo "Bye."
exit 1
fi
答え4
POSIXは移植性が劣りますが、Bashで動作します。
if [[ $PHONE_TYPE != @(NORTEL|NEC|CISCO) ]]; then
echo 'Phone type must be NORTEL, CISCO, or NEC' >&2
exit 1
fi