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