developer tip

case 문을 숫자 범위와 일치시키는 방법은 무엇입니까?

optionbox 2021. 1. 7. 07:53
반응형

case 문을 숫자 범위와 일치시키는 방법은 무엇입니까?


0-50 범위에있을 수있는 열 번호로 스위치 케이스를 실행하고 있습니다. 이제 각 케이스는 개별 열 번호를 지원하며 실패를 관찰합니다.

다음은 코드입니다.

    i=10
    a=1
    b=0.65
    if [ "$a" != "$b" ]; then 
       case $i in  
            [1]|[2]|[5]) echo "Not OK"; ;; 
            [9-10]|[12]) echo "may be ok"; ;; 
            *) echo "no clue - $i"; ;; 
       esac
   fi

이 코드가 출력 될 것으로 예상 may be ok하지만 no clue - 10.


Bash case는 숫자 범위에서 작동하지 않습니다. []쉘 패턴 용입니다.

예를 들어이 케이스 [1-3]5|6)는 15 또는 25 또는 35 또는 6에서 작동합니다.

코드는 다음과 같아야합니다.

i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
   case $i in
        1|2|5) echo "Not OK"; ;;
        9|10|12) echo "may be ok"; ;;
        *) echo "no clue - $i"; ;;
   esac;
fi

9에서 10 사이i 가 될 수 있으면 범위와 함께 (대소 문자 대신) 사용해야 합니다.real if


if[솔루션

arg=1
if [ "$arg" -lt 5 ]; then
  echo 'less than 5'
elif [ "$arg" -lt 15 ]; then
  echo 'less than 15'
elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
  echo '17 or 19'
else
  echo 'neither'
fi

POSIX 7

Bash는 https://stackoverflow.com/a/25482040/895245에서 언급 한대로 POSIX를 따릅니다.

다음은 인용문입니다. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 섹션 "Case Conditional Construct":

조건부 구성 케이스는 여러 패턴 중 첫 번째 패턴에 해당하는 복합 목록을 실행합니다 (패턴 일치 표기법 참조) [...] 동일한 복합 목록을 가진 여러 패턴은 '|'로 구분됩니다. 상징. [...]

케이스 구성의 형식은 다음과 같습니다.

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

그런 다음 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 섹션 "2.13. 패턴 일치 표기법"은 다음과 같이 말합니다.

[여는 대괄호가 XBD RE 대괄호 식에서와 같이 대괄호 식을 도입하는 경우

and extended regular expressions points to section "9.3.5 RE Bracket Expression" which says:

A bracket expression (an expression enclosed in square brackets, "[]" ) is an RE that shall match a specific set of single characters, and may match a specific set of multi-character collating elements, based on the non-empty set of list expressions contained in the bracket expression.

So only individual characters are considered when you do something like:

[9-10]

ReferenceURL : https://stackoverflow.com/questions/25481799/how-to-make-case-statement-match-a-number-range

반응형