shell脚本判断某一天是否是当月的最后一个周四

shell脚本判断某一天是否是当月的最后一个周四

需求

最近遇到了这样的一个需求,要求在每个月的最后一个周四加三天来执行一个固定的脚本,于是就因为判断最后一个周四用了很久,在此记录一下。

实现的思路

整体的思路如下:
将当前的日期减去三天后,得到三天前的日期,判断得到的三天前的日期是否是该日期所在月的最后一个周四。
具体的实现

  1. 先创建一些变量以供后续的使用
//表示三天前的日期所在的年:2018
year=$(date -d "-3 day" + %Y)
//表示三天前的日期所在的月:11
month=$(date -d "-3 day" + %m)
//表示三天前的日期所在的日:27
day=$(date -d "-3 day" + %d)
//表示三天前的日期是星期几
week=$(date -d "-3 day" + %u)
//表示三天前的日期年月日形式:20181127
daytime=$(date -d "-3 day" + %Y%m%d)
//表示三天前的日期的年月表示形式:201811
month1=${daytime:0:6}
//三天前所在的月的最后一天
monthEndday=${month}$(cal ${month} ${year}|perl -0nle 'print+(split)[-1]')
//最后一天是周几
lastday_week=$(day -d ${monthEndday} +%u)
  1. 准备工作 完成,现在开始进行判断。我的判断思路是这样的,先找出来指定日期坐在月的最后一周,然后判断该日期是否在最后一周内,如果在的话,再判断是否是周四。
    但是这样的就存在一个问题,如果这个月的最后一天恰好是周一,那么取最后一周的数据时,只能取到周一,将无法找到最后一个周四,遇到这种情况就需要取出最后两周。因此需要分两种情况实现:
    这个月的最后一天大于等于周四,就取最后一周进行比较。
    这个月的最后一天小于周四,就取这个月的最后两天进行比较。
//判断该月的最后一天的星期数是否大于4
if [ $lastday_week -ge 4 ];then
   //取最后一周的所有日期,例如2018年11的最后一周是26 27 28 29 30,-m表示周一是一周的开始
   lastweek=$(cal -m "$month" "$year" | sed '/^$/d' | tail -1)
   //判断指定的日期是否在最后一周的范围内
   justD=$(echo "${lastweek}" | grep "${day}" | wc -l)
   //如果是1,表示在该范围内,是0表示不在
   if [ ${justD} -eq 1 ];then
      //如果是最后一周,判断只当日期是否是周四
      if [ ${week} -eq 4 ];then
         sh lastThursday.sh
      fi
   fi
 else
  //取当月的最后两周
  lastweek=$(cal -m "$month" "$year" | sed '/^$/d' | tail -2)
   justD=$(echo "${lastweek}" | grep "${day}" | wc -l)
   if [ ${justD} -eq 1 ];then
      if [ ${week} -eq 4 ];then
         sh lastThursday.sh
      fi
   fi
 fi
 

至此,该需求完成。

猜你喜欢

转载自blog.csdn.net/weixin_43192721/article/details/84566309