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

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

脚本内容大概主要包括以下: 1、有且只有两个输入参数,都是必输项。 2、参数的格式是日期且格式是“yyyyMMdd"(如:20140101) 3、第二个参数一定要比第一个参数晚 4、最终的执行结果就是将两个日期区间的日期打印出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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