在Shell中使用日期运算和比较

#!/bin/bash
startDate="$1"
endDate="$2"
DATE_FMT="%Y%m%d"

source ./log.sh
export DEBUG="true"

function showUsage() { 
	warn ""
	warn "------------------------ Usage ----------------------------- "
	warn " Syntax:  checkInputDates.sh <start date> <end date>"
	warn ""
	warn " Remark: " 
	warn "   1.Two arguments are required and must with format ‘YYYYmmDD‘."
	warn "   2.Named ‘end date‘ argument must be greater then or equal to ‘start date‘ argument."
	warn ""
	warn "  Example: checkInputDates.sh 20140102 20140901" 
	warn "------------------------------------------------------------ "
}

function checkDateValid() {
	local myDate=$1
	local exp="date +$DATE_FMT -d $myDate"
	if [ "$myDate" == "`$exp`" ]; then
		echo "1"
	else 
	    echo "0"
	fi  
} 
function datesDiff() {
	local d1=`date +$DATE_FMT -d $1`
	local d2=`date +$DATE_FMT -d $2`
	local cr=$(($d1-$d2)); ##Diff in ‘day‘ unit.
	echo $cr
}
function compareDates() { 
	local cr=$(datesDiff $1 $2); ##Diff in ‘day‘ unit.
	##debug "Compare: $(($(date +$DATE_FMT -d $1) - $(date +$DATE_FMT -d $2)));"; 
	if [[ $cr -eq 0 ]]; then 
		echo "0"
	elif [[ $cr -gt 0 ]]; then
		echo "1"
	else 
		echo "-1"  
	fi
}

function toTomorrow() {

	local curDate=$1
	##debug "date -d ‘$curDate +1 day ‘ +$DATE_FMT"
	##echo `date -d "$curDate +1 day " +$DATE_FMT`
	echo $((`date +$DATE_FMT -d $curDate`+1))
}

###### Check inputs ################ 
#1. Only two arguments.
warn ""
if [ $# != 2 ]; then
	warn "ERROR: Only support two arguments input." | showUsage 
	exit 1;
fi 

#2. Check if they‘re the leagal value.
tmpSd=$(checkDateValid $startDate) 
if [ "$tmpSd" == "0" ]; then ###It‘s the invalid date. eg: 20141901
	warn "ERROR: Invalid ‘start date‘ with input ‘$startDate‘, it must be with format ‘yyyyMMdd‘, eg: 20140101" | showUsage
	exit 1;	
fi   
tmpEd=$(checkDateValid $endDate) 
if [ "$tmpEd" == "0" ]; then ###It‘s the invalid date. eg: 20141901 
	warn "ERROR: Invalid ‘end date‘ with input ‘$startDate‘, it must be with format ‘yyyyMMdd‘, eg: 20140101" 
	exit 1;
fi

#3. Check the arg2 greater than or equal arg1.
##echo "Compare result: "$(compareDates $endDate $startDate)
cprs=$(compareDates $endDate $startDate)
echo "Diff days: $(datesDiff $endDate $startDate)."
if [ "$cprs" == "-1" ]; then
	warn "ERROR: The first argument must not greater than the second one!" | showUsage 
	exit 1;
fi
######################################
##loop the dates between start and end date.
while [[ "$startDate" != "$endDate" ]]
do
	echo $startDate
	startDate=$(toTomorrow $startDate)
done
 

echo "---Input arguments---"
echo "startDate:"$startDate
echo "---Input arguments---"


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。