1, 计算方法
#!/bin/bash
# month.lastday.sh
# 指定月份,必须是 YYYYMM 格式
if [[ $1 == "" ]]; then
# 未指定,默认当月
S_MTH=`date "+%Y%m"`
else
S_MTH=$1
fi
# 第一种方法
## 原理:打印月历、参数化、取最后一列
## 解析日期字符串
S_YEAR=${S_MTH:0:4}
S_MONTH=${S_MTH:4:2}
S_LAST_DAY=`cal $S_MONTH $S_YEAR | xargs | awk '{print $NF}'`
echo $S_MTH$S_LAST_DAY
# 第二种方法
## 原理: 指定月份的下月1日,减1天,即为上月最后一天
S_NEXT_MTH_FIRST_DAY=`date -d "${S_MTH}01 1 months" "+%Y%m%d"`
S_LAST_DAY=`date -d "-d $S_NEXT_MTH_FIRST_DAY -1 days" "+%Y%m%d"`
echo $S_LAST_DAY
程序输出
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh
20200731
20200731
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh 202006
20200630
20200630
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh 202012
20201231
20201231
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh 201901
20190131
20190131
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh 202002
20200229
20200229
[ossNokia@bo-interface02 ~]$ ./month.lastday.sh 201902
20190228
20190228
[ossNokia@bo-interface02 ~]$
2, cron设置
59 23 28-31 * * /home/root/run.month.lastday.task.sh
3, 任务程序
#!/bin/bash
# run.month.lastday.task.sh
# 第一种方法
S_MONTH_YEAR=`date "+%m %Y"`
if [[ `date "+%d"` == `cal $S_MONTH_YEAR | xargs | awk '{print $NF}'` ]]; then
# 这里编写你自己的功能代码
df -Th
fi
# 第二种方法
S_NEXT_MTH_FIRST_DAY=`date -d "1 months" "+%Y%m%d"`
if [[ `date "+%d"` == `date -d "-d $S_NEXT_MTH_FIRST_DAY -1 days" "+%d"` ]]; then
# 这里编写你自己的功能代码
df -Th
fi