Solaris에서 정규식과 비교할 때 =~ 연산자가 구문 오류를 발생시키는 이유는 무엇입니까?

Solaris에서 정규식과 비교할 때 =~ 연산자가 구문 오류를 발생시키는 이유는 무엇입니까?

나는 다음 코드를 사용했다

appcount_range="^[1-$APP_COUNT]$"
    until [[ $APP_OPTION =~ $appcount_range ]]
    do
            echo "INVALID CHOICE! Please enter a valid option:"
            read APP_OPTION
    done

메뉴 옵션이 올바르게 입력되었는지 확인합니다. APP_COUNT는 동적으로 결정되므로 유효한 옵션을 하드코딩할 수 없습니다. 이 코드는 ksh93을 사용하는 Linux 기반 서버에서 완벽하게 실행되지만 ksh88을 사용하는 Solaris 서버에서는 동일한 코드에서 구문 오류가 발생합니다.

syntax error at line ## : '=~' unexpected

ksh88에 =~인식된 연산자가 없는 이유는 무엇입니까 ? 정규식을 비교하는 대신 무엇을 사용해야 합니까?

답변1

/bin/ksh이것은 ksh88(및 Solaris 10 및 이전 버전)의 오류 출력입니다 /usr/xpg4/bin/sh.

[[ ... ]]구문은 ksh에서 나왔지만 내부 =~는 실제 bashism 중 거의 하나입니다. bash실제로 이를 도입한 쉘입니다(버전 3.0).

나중에 추가되었으므로 ksh93및 의 Solaris 11 이상 버전에서도 사용할 수 있지만 몇 가지 변형이 있습니다(연산자는 및 의 / 빌드에서도 작동함). ksh88은 90년대 이후 업데이트되지 않았습니다(일부 시스템의 버그 수정 또는 POSIX 일관성 수정 제외)./bin/sh/bin/kshzsh=~test[zshyash

여기서는 정규식이 필요하지 않으며 와일드카드 패턴도 작동합니다.

[[ $APP_OPTION = [1-$APP_COUNT] ]]

ksh의 연산자 의 경우 =오른쪽 피연산자는 와일드카드 패턴입니다. 또는 패턴 일치를 위해 표준 방법을 사용할 수 있습니다.

case $APP_OPTION in
  [1-$APP_COUNT]) ...
esac

9보다 큰 값에서는 작동하지 않습니다. 2와 1(및 일부 로케일에서와 같이 정렬된 다른 문자 ) 에서만 일치하는 [1-12]것과 같습니다 .[21-1]1

ksh 와일드카드 패턴은 기능적으로 확장 정규식과 동일하지만( {x,y}최신 변형의 ERE 간격 연산자 제외) 구문은 다릅니다.

  • .->?
  • .*->*
  • x*->*(x)
  • x|y->@(x|y)
  • x?->?(x)
  • x+->+(x)
  • [^x]->[!x]
  • x{3,5}-> xxx?(x)?(x)(ksh93에는 있고 {3,5}(x)ksh88에는 없습니다).

여전히 정규식을 사용해야 하는 경우 별도의 유틸리티를 사용해야 합니다.

expr "x$string" : "x$regexp" # BRE, anchored at the start

STRING=$string RE=$regexp command -p awk '
  BEGIN{exit(!(ENVIRON["STRING"] ~ ENVIRON["RE"]))}'

관련 정보