在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---"
时间: 2024-10-08 19:21:59

在Shell中使用日期运算和比较的相关文章

shell中的数学运算

shell中要进行数学运算通常有3中方法: expr命令 比如 expr 1 + 6就会返回7,使用expr的缺点就是碰到乘法运算,或者加括号(因为它们在shell中有其他意义),需要使用转义,比如:expr \( 2 + 3\)  \* 5,这样就会使得表达式很难看 $[expression]命令 使用$[expression]命令也可以进行数学计算,并且比expr方便的是*和括号可以不用转义,比如仍然计算(2 + 3) * 5,可以直接写为: result=$[ (2 + 3) * 5 ]

Shell中数学计算/运算

shell中的赋值和操作默认都是字符串处理. 1)使用let(只能进行整数运算)var=1let "var+=1"echo $var输出结果为2 注意:a)let几乎支持所有的运算符b)方幂运算应使用“**”c)参数在表达式中直接访问,不必加$d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上e)let后的表达式只能进行整数运算 2)使用(())var=1((var+=1))echo $var输出结果为2注意:(())的使用方法与let完全相同 3)使用

shell脚本中的数学运算

shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法.以后用到的时候能够来看,呵呵 1.错误方法举例 a) var=1+1 echo $var 输出的结果是1+1,悲剧,呵呵 b) var=1 var=$var+1 echo $var 输出结果是1+1.依旧悲剧,呵呵 2.正确方法 1)使用let var=1 let "var+=1" echo $var 输出结果为2.这次没有悲剧 注意: a)经我測试let差点儿支持全部的运算符,在网上看到一篇文

linux在shell中获取时间

获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用date的 -d参数 获取明天的日期 date -d next-day +%Y%m%d 获取昨天的日期 date -d last-day +%Y%m%d 获取上个月的年和月 date -d last-month +%Y%m 获取下个月的年和月date -d next-month +%Y%m 获取明年

shell简单用法笔记(shell中数值运算)二

shell中变量值,如果不手动指定类型,默认都是字符串类型: 例如: a=123 b=456 c=$a+#b echo $c 结果会输出:123+456 shell中,如果要进行数值运算,可以通过一下方法: 方法1: a=123 b=456 c=$(($a+$b)) 方法2: a=123 b=456 declare -i c=$a+$b 通过declare -i 来声明c的数值类型为int类型 方法3: a=123 b=456 c=$(expr $a + $b) 注意+号两边有空格 通过貂绒ex

shell脚本中获取日期

数字时间转标准时间: 数字时间如:20151009163000 标准时间:2015-10-19 16:30:00 a=`head -1 /home/xxx/xxx/bin/.status |awk -F= '{print $2}'|sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/'` 把标准时间转换成秒(据1970-1-1): date -d "$a" +%

shell中$(( )) 与 $( ) 还有${ }的区别

http://blog.chinaunix.net/uid-14351756-id-2820651.html $( ) 与 ` ` (反引号)在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的. 所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:* 完成引号里的命令行,然后将其结果替换出来,再重组命令行.例如:[code]$ echo the last sunday is $(date -d "la

Linux CentOS 7 shell中的特殊字符及与管道相关的命令(cut,sort,wc,uniq,tee,tr,split)

一. shell特殊符号cut命令 1.特殊符号 * :任意个任意字符 ? :任意单个字符# :注释\ :转义字符 | :管道符 2.几个和管道相关的命令 (1) cut cut 把文件分段 cat /etc/passwd cut -d: -f 3  /etc/passwd    cut -d: -f 3,6,5  /etc/passwd cut -d: -f 3-6  /etc/passwd cut -c 10 /etc/passwd   取第十个字符 cut -c 5-10 /etc/pas

shell中$(( )) 、 $( ) 、${ }的区别

$( ) 与 ` ` (反引号)在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的. 所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:* 完成引号里的命令行,然后将其结果替换出来,再重组命令行.例如:[code]$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)[/code]如此便可方便得到上一星期天的日期了- ^_^