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
같은 외부 도구를 사용할 수 있습니다 .grep
if
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]+
)가 옵니다.
^
문자열의 시작( )과 끝( )에 일치 항목을 고정하여 일치의 완전성을 보장하므로 $
단순한 하위 문자열 일치로는 결과가 트리거되지 않습니다.