shell中的日期问题,要彻底弄清楚。写一个测试脚本test.sh
首先是单引号 双引号的问题。
单引号将变量和特殊字符括起来将失去原有的意义,而只作为普通字符解释。双引号括起来后特殊字符将保持原有的意义,其余的作为普通字符解释。
#!/bin/sh
. ~/.bash_profile
source /etc/profile
current_day=date +%Y%m%d 无符号
echo "current_day:$current_day"
测试结果为 current_day:
current_day=`date +%Y%m%d`单引号(tab上的单引号)
测试结果为 current_day:date +%Y%m%d
current_day=“date +%Y%m%d" 双引号
测试结果为 current_day:date +%Y%m%d
current_day=“`date +%Y%m%d`" 外双内单 (这里把双引号去掉也可以!!!!!)
测试结果为 current_day:20171010
两天后=`date -d "2 day"`
测试结果为 两天后:2017年 10月 12日 星期四 10:43:22 CST (如果不加+%Y%m%d,则会显示两天后此时此刻的全部日期信息,包括时分秒)
(这里说明day是特殊字符,用双引号括起来也保持其特殊意义。)
两天后=`date +%Y%m%d -d "2 day"`
测试结果为 两天后:20171012
两天前=`date +%Y%m%d -d "2 day ago"`
测试结果为 两天前:20171008 (这里说明ago是特殊字符有特殊意义,用双引号括起来也保持其特殊意义。)
last_month=`date -d "1 month ago"` 获取一个月以前的当前时间
测试结果为 last_month:2017年 09月 10日 星期日 11:00:34 CST
始终都要保持外面有个单引号 这样啊 混蛋!
普及完基础知识,来电高端点的
求昨天的日期
如果现在的时间是20180101,那 1 day ago这种写法还行得通吗?
有一个思路就是
正确的做法应该是在脚本一开始就取得当前的时间戳, 然后, 在整个脚本中, 始终使用这个时间戳来做为当前时间, 这才能保证, 在整个脚本的运行期间, 你得到的结果,都是你想要的, 而不管你是在午夜,还是大早上的运行你的脚本. 关于时间的计算, 最好是以"秒"为最小单位, 这样, 不仅可以保证你得到精确的时间, 还能保证你躲过什么1号, 或者年底, 或者闰年, 之类的麻烦.我今天实测的
current_time="`date +%s`"
echo "current_time:$current_time"
current_day=`date +%Y%m%d -d @$current_time`
echo "current_day:$current_day"
yesterday=`date +%Y%m%d -d @$((current_time-86400))`
echo "yesterday:$yesterday"
求上个月
#坑01
#2016年当month为01的时候,上年月份为2015-12
#2016年当month为12的时候,下年月份为2017-01
#2016年当month为其余月份时候,月份加1或者减一
year=`date -d "0 month ago" +%Y`
month=`date -d "0 month ago" +%m`
nowdate=`date -d "0 month ago" +%Y-%m`
one='01'
if [ $month == $one ]
then
echo "当month为01的时候,上年月份为2015-12"
LastYear=$[$year-1]
Lastdate=$LastYear-12
Nextdate=$year-0$[$month+1]
echo $Lastdate
echo $nowdate
echo $Nextdate
fi
twelve='12'
if [ $month == $twelve ]
then
echo "当month为12的时候,下年月份为2017-01"
NextYear=$[$year+1]
Lastdate=$year-$[$month-1]
Nextdate=$NextYear-01
echo $Lastdate
echo $nowdate
echo $Nextdate
fi
还有一种情况是
date +%Y%m -d "`date +%Y%m`01 -1 month"