OR 게이트를 사용하는 단일 if 문 셸 스크립트의 여러 문자열 비교

OR 게이트를 사용하는 단일 if 문 셸 스크립트의 여러 문자열 비교

변수에 저장된 문자열을 세 개의 다른 문자열과 비교하려고 하는데 둘 중 어느 것도 일치하지 않으면 오류가 발생합니다. 논리 연산자 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다음을 수행할 수 있습니다.zshksh

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또는 의 경우 또 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]))...

관련 정보