내 스크립트가 수신하는 인수 중 하나는 다음 형식의 날짜입니다 yyyymmdd
.
입력으로 유효한 날짜가 있는지 확인하고 싶습니다.
어떻게해야합니까? 정규식을 사용하려고합니다.[0-9]\{\8}
답변
[[ ]]
정규 표현식 일치 연산자와 함께 테스트 구문을 사용할 수 있습니다 .=~
문자열이 정규식 패턴과 일치하는지 확인할 수 있습니다.
구체적인 경우에는 다음과 같이 쓸 수 있습니다.
[[ $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"
답변
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') ]
답변
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에게 감사드립니다.
답변
정규식을 사용하여 날짜의 문자 순서가 올바른지 확인하는 데 도움이 될 수 있으면 날짜가 유효한지 쉽게 확인할 수 없습니다. 다음 예제는 정규식을 전달하지만 모두 유효하지 않은 날짜입니다. 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
답변
