在Shell中使用日期运算和比较
2014-12-24 00:00
459 查看
摘要: 脚本内容大概主要包括以下:
1、有且只有两个输入参数,都是必输项。
2、参数的格式是日期且格式是“yyyyMMdd"(如:20140101)
3、第二个参数一定要比第一个参数晚
4、最终的执行结果就是将两个日期区间的日期打印出来。
1、有且只有两个输入参数,都是必输项。
2、参数的格式是日期且格式是“yyyyMMdd"(如:20140101)
3、第二个参数一定要比第一个参数晚
4、最终的执行结果就是将两个日期区间的日期打印出来。
#!/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 "------------------------------------------------------------ " } DATE_FMT=${DATE_FMT:-"%Y%m%d"} ##Default with format "%Y%m%d", eg: 20140102 function checkDateValid() { local myDate=$1 local exp="date +$DATE_FMT -d $myDate" if [ "$myDate" == "`$exp`" ]; then echo "1" else echo "0" fi } ### ## TODO: It's not correctly. ## function datesDiff() { local d1=`date -d "$1" +%s` local d2=`date -d "$2" +%s` ##debug "Dates: "$d1 $d2 local cr=$(($d1-$d2)); ##Diff in 'day' unit. echo $cr } ## # Return the day after input date. # Usage: toTomorrow <input date> ## function compareDates() { ## `date -d " 20141225 1 day" +%Y%m%d` 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 } ## # Return the day after input date. # Usage: toTomorrow <input date> ## function toTomorrow() { local curDate="$1" ##debug $curDate ##TODO: Must be adapted to DATE_FMT... ##curDate="${curDate:0:4}-${curDate:4:2}-${curDate:6:2}" ##debug "date -d '$curDate +1 day ' +$DATE_FMT" ##echo `date -d "$curDate +1 day " +$DATE_FMT` ##echo `date +$DATE_FMT -d "1 day $curDate"` echo `date -d "1 day $curDate" +$DATE_FMT` } function countStrsByBlank() { ##local str="$1" ##local sep="${2:-' '}" ##echo $str | awk -v v="$sep" '{ split($0, a, v);for(i in a) {c=i;}} END {print c;}' set j=0 for item in $dates do let j=j+1 done echo $j } ## # Get the diff date list between input two dates. # Usage: getDiffDateList <end date> <start date> ## function getDiffDateList() { local endd=$1 local stad=$2 dl=() while [[ "$stad" != "$endd" ]] do dl=(${dl[*]} "$stad") stad=$(toTomorrow $stad) done dl=(${dl[*]} "$stad") echo "${dl[*]}" } ###### 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) 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
相关文章推荐
- SHELL四则运算和比较
- 使用@Text进行日期比较
- 不在WHERE子句中使用如ExitTime>GETDATE() - 10的日期运算语句大幅优化性能
- JS日期比较,使用正则表达式转换
- JS日期比较,使用正则表达式转换
- 使用strtotime作日期比较
- Shell比较两个日期的大小
- c++课程设计 对日期及时间的基本运算(时间类和日期类) 使用重载
- c++课程设计 对日期的基本运算 使用重载
- shell 日期运算 指定日期
- 使用@Text进行日期比较
- ACCESS中如何比较日期和时间,使用DateDiff函数
- 在动态方法中的比较运算 (使用.net 中的动态方法编程备忘录9)
- Shell比较两个日期的大小
- javascript比较日期的方法与replace方法的使用
- [Shell] 日期运算的相关方法
- SHELL 四则运算和比较
- linux下shell日期运算
- shell的比较运算介绍
- let 与 expr Shell运算比较 let强强胜出