不等演算子を使用した文字列の比較

不等演算子を使用した文字列の比較

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

関連情報