BASH: $1 위치의 OR 연산자

BASH: $1 위치의 OR 연산자

OR 연산자가 $1에 작동하지 않는 문제가 있습니다. 예를 들어:

if [[ "$1" != '1' || '2' ]]
        then
               echo "BAD"
        else
               echo "OK"
        fi

이 테스트를 실행하면 $1이 무엇이든 항상 BAD가 발생합니다.

1달러를 1이나 2로 어떻게 묶을 수 있나요?

답변1

표준 sh구문 사용(따라서 bash다른 모든 POSIX 호환 셸에서 인식됨):

case $1 in
  (1 | 2) echo OK;;
  (*) echo BAD;;
esac

또는:

if [ "$1" = 1 ] || [ "$1" = 2 ]; then
  echo OK
else
  echo BAD
fi

(이것은 문자열의 바이트 간 비교입니다. 01, 1e0, 1.0, 20/20, 0x1도 수치상으로는 와 동일하다고 간주될 수 있지만 불량으로 간주됩니다 1.)

생성자 =(복사본)의 / 연산자는 실제로 항등 연산자가 아닌 패턴 일치 연산자입니다. 따라서 이 특별한 경우 단일 문자를 일치시키려는 경우 해당 항목에 사용된 표준 구문처럼 이를 수행할 수도 있습니다. 방법.!=bash[[...]]ksh[[ $1 != [12] ]]case $1 in ([12])sh

답변2

BAD항상 진술로 분기하는 이유 if는 테스트가

[[ "$1" != '1' || '2' ]]

먼저 $1그렇지 않은지 테스트 1하고 그렇지 않은 경우 BAD인쇄하십시오. 그렇다면 2테스트로 평가됩니다. 이와 같은 문자열은 2항상 true이며 BAD인쇄됩니다.

대신에:

if [ "$1" != '1' ] && [ "$1" != '2' ]; then

또는 산술 테스트를 통해

if [ "$1" -ne 1 ] && [ "$1" -ne 2 ]; then

또는 산술 평가를 사용하여

if (( $1 != 1 )) && (( $1 != 2 )); then

답변3

if [[ "$1" != '1' || "$1" != '2' ]]
then
               echo "BAD"
else
               echo "OK"
fi

그런 다음 2와 1이 같지 않은 경우 != 문을 반복해야 합니다.

답변4

논리에 ($1 != 1) OR ($1 != 2)결함이 있습니다.

그렇다면 $1그것은 1이다아니요같음 2이므로 테스트는 참입니다.
게다가 그렇다면 $1그렇죠 2.아니요같으 1므로 테스트도 유지됩니다. 즉, 테스트는 항상 옳습니다.

($1 == 1) or ($1 == 2)다음과 같이 동등성을 테스트해야 합니다 .

if [[ ($1 == '1') || ($1 == '2') ]]; then
    echo "$1 OK"
else
    echo "$1 BAD"
fi

또는 더 간단합니다(ksh, bash 또는 zsh).

[[ $1 == [12] ]] && echo "$1 OK" || echo "$1 BAD"

또는 sh 구문을 사용하십시오(모든 POSIX 쉘에 이식 가능).

if [ "$1" = '1' ] || [ "$1" = '2' ]; then
            echo "$1 OK"
else
            echo "$1 BAD"
fi

또는 사례 관용구를 사용하여:

case $1 in
    (1 | 2) echo "$1 OK"  ;;
    (*) echo BAD "$1 BAD" ;;
esac

위의 내용은 모두 문자열 비교입니다. 숫자 비교를 원할 경우 다음을 수행할 수 있습니다.

if [ "$1" -eq 1 ] || [ "$1" -eq 2 ]; then
            echo "$1 OK"
else
            echo "$1 BAD"
fi

$1그러나 이 방법은 다른 숫자 값이 1.01e0같거나 같은 경우에는 작동하지 않습니다 1. 01또는 함께 작동합니다 0001.

관련 정보