Case 문 내의 유효한 버전 번호와 일치합니다.

Case 문 내의 유효한 버전 번호와 일치합니다.

case명세서의 버전 번호 와 일치시키고 싶습니다 . 버전 번호는 다음과 같습니다.

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2

그리고 쉘 변수에 저장됩니다: version.

인터넷에서 검색해보니 -statement에서 정규식을 일치시키는 것은 어렵지 않습니다 case. 그러나 -statement에서 이를 수행하는 방법에 대한 아이디어가 있거나 도움을 줄 수 있는 사람이 있습니까 case?

나는 성공하지 않고 다음을 시도했습니다.

case "$version" in
    "([0-9]+\.*)+")
                  echo "Correct"
        ;;
                 *)
                  echo "Not Correct"
        ;;
esac

답변1

case쉘 모드만 지원되며 정규식은 지원되지 않습니다. 그러나 Bash는 다른 구문을 사용하여 즉시 정규식을 지원합니다.

예를 들어 "점으로 구분된 임의의 수의 소수 자릿수"를 의미하고 뒤에 오는 문자나 레이블이 없는 경우 이 패턴이 ^[0-9]+(\.[0-9]+)*$적절할 수 있습니다. ([0-9]+\.*)+문자열을 연속 또는 후행 점과 일치시키는 것도 가능합니다. 예를 들면 1.2..3.다음과 같습니다.

#!/bin/bash
re='^[0-9]+(\.[0-9]+)*$';
if [[ $version =~ $re ]]; then
    echo "'$version' matches the pattern"
else
    echo "'$version' doesn't match"
fi

정규식은 임의의 소수 자릿수( [0-9]+) 뒤에 리터럴 (·)*점( )과 임의 수의 소수 자릿수 \.( )로 구성된 임의 수의 그룹( [0-9]+)을 찾는 것을 의미합니다. 패턴을 문자열의 시작과 끝 부분에 고정 ^합니다 $. 그렇지 않으면 일치하는 하위 문자열만으로도 충분합니다.

예를 들어 123두 개 이상의 숫자와 점이 필요하면 ^[0-9]+(\.[0-9]+)+$(마지막 숫자를 *로 변경 +)을 사용하세요.

로케일에 따라 [0-9]일치하는 내용이 다소 이상할 수 있으며, 더 이상한 유니코드 숫자가 포함될 수도 있습니다. 허용되는 문자를 철자하면 [0123456789]더 엄격해지지만 작성하기가 더 어색하고 오류가 발생하기 쉽습니다.

답변2

case정규식이 아닌 쉘 패턴과 일치합니다. 따라서 ^[0-9]+(\.[0-9]+)*$정규식 대신 다음을 사용할 수 있습니다.

case $version in
  '' | *[!0123456789.]* | .* | *. | *..* ) echo invalid;;
  * ) echo fine;;
esac

즉, 일치의 의미를 "반전"하고 표준 쉘 패턴을 사용하여 유효하지 않은 조건을 감지합니다.

bash 옵션 은 명령문 내 일치 extglob에 적용됩니다 . 따라서 match 를 사용하여 case설정 shopt -s extglob하면 .+()*()+([0123456789])*(.+([0123456789]))

답변3

이것이 필요하지 않은 경우 다음 과 case같은 외부 도구를 사용할 수 있습니다 .grepif

if grep -q -E '^[0-9]+(\.[0-9]+)*$' <<< "$version"
then
    printf "%s is a valid version\n" "$version"
else
    printf "%s is NOT a valid version\n" "$version"
fi

다음을 포함하는 버전 문자열을 허용합니다.

  • 하나 이상의 필드는 하나 이상의 연속 숫자( [0-9]+)로 구성되며 그 뒤에는
  • 0개 이상의 구분 기호 .(\.정규식에서 단순히 ."모든 문자"를 의미하도록 이스케이프되었습니다 .), 그 뒤에 하나 이상의 연속된 숫자(다시 [0-9]+)가 옵니다.

^문자열의 시작( )과 끝( )에 일치 항목을 고정하여 일치의 완전성을 보장하므로 $단순한 하위 문자열 일치로는 결과가 트리거되지 않습니다.

관련 정보