부등 연산자를 사용한 문자열 비교

부등 연산자를 사용한 문자열 비교

PHONE_TYPE변수에 세 가지 유효한 값 중 하나가 포함되어 있는지 확인하려고 합니다 .

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

두 번째 참고 사항은 대문자 변수 이름을 사용할 때 주의해야 한다는 것입니다. 이는 거의 항상 대문자인 시스템에 의해 도입된 변수 간의 충돌을 방지하기 위한 것입니다. 그래서 $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

관련 정보