쉘에서 두 날짜를 비교하는 방법은 무엇입니까?
현재로서는 작동하지 않지만 어떻게 사용하고 싶은지에 대한 예는 다음과 같습니다.
todate=2013-07-18
cond=2013-07-15
if [ $todate -ge $cond ];
then
break
fi
원하는 결과를 어떻게 얻을 수 있습니까?
답변1
정답이 아직 누락되었습니다.
todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)
if [ $todate -ge $cond ];
then
break
fi
여기에는 GNU 날짜가 필요합니다. date
BSD에 해당하는 구문 date
(OSX에서 기본적으로 발견됨)은 다음과 같습니다.date -j -f "%F" 2014-08-19 +"%s"
답변2
ksh 스타일 문자열 비교를 사용하여 [연, 월, 일 형식의 문자열]의 시간순을 비교할 수 있습니다.
date_a=2013-07-18
date_b=2013-07-15
if [[ "$date_a" > "$date_b" ]] ;
then
echo "break"
fi
다행히 [YYYY-MM-DD 형식의 문자열]은 알파벳순으로 정렬되면 시간순으로도 정렬됩니다.
(* - 정렬 또는 비교)
이 경우에는 멋진 것이 필요하지 않습니다. 응!
답변3
비교를 위한 날짜 형식이 누락되었습니다.
#!/bin/bash
todate=$(date -d 2013-07-18 +"%Y%m%d") # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d") # = 20130715
if [ $todate -ge $cond ]; #put the loop where you need it
then
echo 'yes';
fi
루프 구조도 누락되었습니다. 더 많은 날짜를 어떻게 얻을 계획입니까?
답변4
이 연산자는 -ge
날짜가 아닌 정수에만 작동합니다.
스크립트가 bash, ksh 또는 zsh 스크립트인 경우 <
대신 이 연산자를 사용할 수 있습니다. 이 연산자는 POSIX 표준을 초과하지 않는 대시 또는 기타 셸에서는 사용할 수 없습니다.
if [[ $cond < $todate ]]; then break; fi
어떤 셸에서든 대시를 제거하여 날짜 순서를 존중하면서 문자열을 숫자로 변환할 수 있습니다.
if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi
또는 기존 방식으로 이 expr
유틸리티를 사용할 수도 있습니다.
if expr "$todate" ">=" "$cond" > /dev/null; then break; fi
루프에서 하위 프로세스를 호출하면 속도가 느려질 수 있으므로 변환을 위해 셸 문자열 처리 구성을 사용하는 것이 좋습니다.
todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi
물론, 처음에 하이픈 없이 날짜를 검색할 수 있다면 와 결합할 수 있습니다 -ge
.