나는 다음 코드를 사용했다
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/ksh
zsh
=~
test
[
zsh
yash
여기서는 정규식이 필요하지 않으며 와일드카드 패턴도 작동합니다.
[[ $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"]))}'