답변:
[[ ]]
정규 표현식 일치 연산자와 함께 테스트 구문을 사용할 수 있습니다 .=~
문자열이 정규식 패턴과 일치하는지 확인할 수 있습니다.
구체적인 경우에는 다음과 같이 쓸 수 있습니다.
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
또는 더 정확한 테스트 :
[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
# | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ |
# | | | | |
# | | \ | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 end of line
# start of line or 10,11,12 or 10..29
# or 30, 31
즉, 원하는 형식과 일치하는 Bash 에서 정규식을 정의 할 수 있습니다 . 이 방법으로 할 수있는 일 :
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
&&
테스트가 성공하면 이후의 명령 이 실행되고 이후의 명령은||
테스트가 실패하면 실행됩니다.
이것은 bash의 사용자 입력 날짜 형식 확인에서 Aleks-Daniel Jakimenko의 솔루션을 기반으로합니다 .
다른 쉘에서는 grep 을 사용할 수 있습니다 . 쉘이 POSIX 호환 인 경우
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
POSIX 호환이 아닌 fish 에서는 할 수 있습니다
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
grep
명령 보다 정규식에 대한 bash 구문을 더 쉽게 이해할 것 -E
입니다.
sh
, fish
또는 덜 장착 된 포탄입니다.
bash 버전 3에서는 '= ~'연산자를 사용할 수 있습니다.
if [[ "$date" =~ ^[0-9]{8}$ ]]; then
echo "Valid date"
else
echo "Invalid date"
fi
참조 : http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF
참고 : Bash 버전 3.2부터는 이중 대괄호 [[]] 내에서 일치 연산자의 인용 부호가 더 이상 필요하지 않습니다.
문자열이 올바른 날짜인지 테스트하는 좋은 방법은 명령 날짜를 사용하는 것입니다.
if date -d "${DATE}" >/dev/null 2>&1
then
# do what you need to do with your date
else
echo "${DATE} incorrect date" >&2
exit 1
fi
의견에서 : 서식을 사용할 수 있습니다
if [ "2017-01-14" == $(date -d "2017-01-14" '+%Y-%m-%d') ]
date -d 2017-11-14e
2017 년 11 월 14 일 05:00:00 UTC를 반환하지만 스크립트가 손상됩니다.
expr match
대신에 사용 합니다 =~
:
expr match "$date" "[0-9]\{8\}" >/dev/null && echo yes
이것은 빈 문자열과도 일치 =~
하므로 =~
IMHO는 사용하지 않아야 하기 때문에 현재 사용되는 대답보다 낫습니다 . badvar
정의되지 않은 다음 [[ "1234" =~ "$badvar" ]]; echo $?
(잘못된) 0
을 expr match "1234" "$badvar" >/dev/null ; echo $?
제공하지만 올바른 결과 를 제공 한다고 가정 하십시오 1
.
우리는 사용할 필요가 >/dev/null
숨기기로 expr match
의 출력 값 일치하는 항목이없는 경우 문자의 수가 일치 또는 0,. 음표 출력값이 상이하다 그 종료 상태 . 일치하는 것이 있으면 종료 상태는 0이고 그렇지 않으면 1입니다.
일반적으로 구문 expr
은 다음과 같습니다.
expr match "$string" "$lead"
또는:
expr "$string" : "$lead"
$lead
정규식은 어디에 있습니까 ? 그것이 exit status
사실이 될 것입니다 (0)의 경우 lead
경기의 주요 슬라이스 string
(이 이름이 있습니까?). 예를 들어 expr match "abcdefghi" "abc"
종료 true
하지만 expr match "abcdefghi" "bcd"
종료 false
합니다. (이 점을 지적한 @Carlo Wood에게 감사드립니다.
=~
빈 문자열과 일치하지 않으면 예제에서 빈 패턴 과 문자열을 일치 시킵니다. 구문은 string =~ pattern
이며 빈 패턴은 모든 것과 일치합니다.
expr match "abcdefghi" "^" && echo Matched || echo No match
-와 expr match "abcdefghi" "bcd" && echo Matched || echo No match
–는 모두 반환 "0\nNo match"
합니다. 일치하는 곳 "a.*f"
이 반환 "6\nMatched"
됩니다. 따라서 예제에서 '^'을 사용하는 것도 불필요하며 이미 암시되어 있습니다.
=~
빈 문자열 일치 동작을 합리화 할 수 있는지 여부가 아닙니다 . 이 동작은 예기치 않은 오류가 발생할 수 있습니다. 나는이 답변에 구체적으로 썼다.
expr
저에게 동의합니다.
정규식을 사용하여 날짜의 문자 순서가 올바른지 확인하는 데 도움이 될 수 있으면 날짜가 유효한지 쉽게 확인할 수 없습니다. 다음 예제는 정규식을 전달하지만 모두 유효하지 않은 날짜입니다. 20180231, 20190229, 20190431
따라서 날짜 문자열 (이라고 부름 datestr
)이 올바른 형식 인지 확인하려면 날짜 를 구문 분석 하고 문자열을 올바른 형식으로 변환 date
하도록 요청 하는 것이 가장 좋습니다 date
. 두 문자열이 모두 같으면 유효한 형식과 유효한 날짜입니다.
if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
echo "Valid date"
else
echo "Invalid date"
fi