날짜 매개변수가 yyyy-mm-dd 형식인지 확인하세요.

날짜 매개변수가 yyyy-mm-dd 형식인지 확인하세요.

날짜 매개변수가 올바른 형식(YYYY-MM-DD)인지 확인하는 방법이 있나요?

웹에서 이것을 얻었지만 나에게는 작동하지 않습니다.

date "+%Y-%m-%d" -d "2015-10-11" > /dev/null  2>&1
echo $?

결과가 나올 것이라고 예상했지만 0그렇지 않았습니다. 누군가 다른 방법을 말해 줄 수 있나요?

답변1

bash그러면 다음에서 올바른 형식(YYYY-MM-DD)을 확인합니다(내장된 정규식 일치 사용).

if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
  then echo "Date $1 is in valid format (YYYY-MM-DD)"
  else echo "Date $1 is in an invalid format (not YYYY-MM-DD)"
fi

달리기:

./script.sh 2015-12-10

산출:

Date 2015-12-10 is in valid format (YYYY-MM-DD)

날짜 자체가 유효한지 확인하지 않고 날짜만 확인합니다.체재(질문에 명시된 대로 "날짜 매개변수가 올바른 형식(YYYY-MM-DD")인지 확인하세요.)

날짜 형식을 확인해야 하는 경우그리고날짜 값을 확인하려면 다음을 시도하십시오.

if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null
      then echo "Date $1 is valid and matches the format (YYYY-MM-DD)"
fi

그러면 0000-88-77과 같이 정규식과 일치하는 잘못된 날짜가 삭제됩니다.

(이 제안에 대해 @glenn jackman에게 감사드립니다.)

답변2

운영 체제에 태그를 지정하지 않으셨고 현재 Linux를 사용하고 계시므로 ksh아마도 Linux를 사용하지 않으실 것으로 추측됩니다.가능한솔라리스를 사용하세요. 귀하가 제공한 명령은 date작동하지만 (또는 )이 GNU 개선 사항인 dateGNU 용입니다.-d--date

따라서 쉬운 옵션은 GNU를 사용하는 것입니다 date. GNU coreutils 패키지를 설치해야 할 수도 있고, 이미 패키지를 가지고 있을 수도 있고( /usr/sfw/binSolaris에서 체크인) 이미 사용 가능하거나 gdate제공될 수도 있습니다 gnudate. 이는 YYYY-MM-DD 형식의 날짜를 올바르게 검증합니다(2015-31-01을 허용하는 다른 정규식 예제와는 달리).

대신 다음 touch과 같은 상황에서 명령을 사용할 수 있습니다.이식성 향상(POSIX)방법

touch -c -d 2015-12-12T00:00:00 /tmp/does-not-exist
  • 이것을 사용 -c하면 파일이 생성되지 않습니다
  • 유효한 타임스탬프를 구성하려면 날짜에 T00:00:00을 추가하세요.

(그러나 Solaris를 사용하는 경우 일부 버전에서는 누락되었을 뿐만 아니라 -d일부 버전에는 유효성을 검사하지 않지만 영리하게 노력하는 버그/버기 기능이 적어도 있다는 것을 발견했습니다. 따라서 "2015-02 -29"는 "2015 "-03-01"이 되며 오류가 없으므로 날짜 확인에 이 버전을 사용할 수 없습니다.)

gawkmawk나는 이 접근 방식을 선호합니다. 이 접근 방식은 강력하고 이식성이 뛰어나며(또는 반대로 전통적인 접근 방식에는 nawk이러한 시간 기능이 부족함) 가정합니다 .

#!/usr/local/bin/gawk -f
BEGIN{
    split(ARGV[1],bb,/-/)
    tm=mktime( bb[1] " " bb[2] " " bb[3] " 00 00 00")
    tms=sprintf("%04i-%02i-%02i",bb[1],bb[2],bb[3])
    if (tms==strftime("%Y-%m-%d",tm)) exit 0
    exit 1
}

~ 위에

  • "-" 문자로 구분된 첫 번째 매개변수를 허용합니다.
  • mktime()지정된 YYYY-MM-DD의 에포크 타임스탬프를 확인합니다.
  • sprintf()정규화된 YYYY-MM-DD(선행 0)
  • strftime()Epoch 시간을 다시 YYYY-MM-DD로 변환하고 문자열로 비교합니다.

추가 변환 및 비교를 수행하는 이유는 mktime()Linux의 glibc의 경우처럼 C 라이브러리가 문제가 있는 날짜를 재해석하는 상황을 포착하기 위한 것입니다( touch위의 Solaris에서도 동일한 문제).

YYYY-MM-DD의 올바른 형식에 관해서는 관심을 의미할 수도 있고 그렇지 않을 수도 있습니다.유효성날짜(뭔가 date완료될 것입니다)는 심지어 제거할 수 있음을 의미할 수도 있습니다.YYYY-DD-MM 형식의 날짜. 형식이 "날짜와 유사"한지 확인하려면 정규식으로 충분합니다.

grep -qE "^[0-9]{4}-[01]?[0-9]-[0123]?[0-9]$"
grep -qE "^[12][0-9]{3}-(0?[1-9]|10|11|12)-(0?[1-9]|[12][0-9]|3[01])$"

(Solaris에서는 /usr/xpg4/bin/grep기본값이 사용되지 않습니다 grep.) 첫 번째는 대부분의 가짜 날짜를 거부하고 두 번째는 거의 모든 가짜 날짜를 거부합니다. 이렇게 하면 -q출력이 없으며 예상대로 반환 코드를 사용할 수 있습니다. ^...$2015-12-12345와 같은 유효한 하위 문자열과 단순히 일치하지 않도록 앵커링( )하거나 정규식을 제한하는 것에 유의하세요.

답변3

날짜가 올바른 형식인지 확인하려면 정규식을 작성하는 방법을 배워야 합니다. 년 월 일

쉬운 방법은 이 작업을 한 줄로 수행하여 날짜와 정규식으로 작업하고 빠르게 배울 수 있도록 하는 것입니다.

echo날짜를 생성한 다음 egrep정규식을 적용하고 일치하는 항목이 있는지 표시하는 데 사용하겠습니다 . 매뉴얼 페이지를 보면 일치 항목 수를 인쇄하는 옵션이 egrep있음을 알 수 -c있으며 날짜만 전송하므로 일치 항목이 발견되었는지 여부에 따라 개수가 0 또는 1이 됩니다.

이것은 당신이 가지고 놀 수 있는 하나의 라이너입니다.

echo 0000-00-00 |egrep -c -e 'regular-expression-in-here'

정규식 삽입(다음에서 수행할 수 있음)AP 통신귀하의 답변에 제공됨) 그것이 얼마나 잘 작동하는지 확인하십시오. 날짜를 변경하고 유효성을 확인하세요. 여기 약간 다른 또 다른 것이 있습니다.

[0-9]{4}-[0-1][0-9]-[0-3][0-9]

답변4

date날짜 출력을 간단히 비교하여 원래 값과 일치하는지 확인할 수 있습니다.

d="2015-10-11"
if [ "`date '+%Y-%m-%d' -d $d 2>/dev/null`" = "$d" ]
then
  echo $d is a valid YYYY-MM-DD date
else
  echo $d is NOT a valid YYYY-MM-DD date
fi

관련 정보