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