如何知道每月的最后一个星期日

Nik*_*ita 1 vmware date

我尝试在 ESXI 上编写脚本,我需要添加“如果是每月的最后一个星期天”。我试试

date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
Run Code Online (Sandbox Code Playgroud)

它不能工作,但它在 Debian 上工作。

在 ESXI 现在输出 8 月

Tob*_*ght 5

我相信问题是

给定一个特定日期,我能否确定它是否是该月的最后一个星期日?

而不是更普遍的问题

给定一个特定的月份,它的最后一个星期日是哪一天?

鉴于此,我们可以将问题分为两部分:

  • 日期是星期天吗?
  • 是这个月的最后一周吗?

对于第一部分,测试很简单:

date -d "$date" +%a  # outputs "Sun" for a Sunday
Run Code Online (Sandbox Code Playgroud)

我们可以测试一下:

test $(date -d "$date" +%a) = Sun  # success if $date is a Sunday
Run Code Online (Sandbox Code Playgroud)

现在,要测试它是否是该月的最后一周,我们可以将一周添加到该日期,看看这是否为我们提供了下个月的前 7 天之一:

test $(date -d "$date + 1week" +%e) -le 7
Run Code Online (Sandbox Code Playgroud)

由于 的工作日与$date + 1week的相同$date,我们可以一次性生成两部分测试,并使用 Bash 正则表达式测试:

if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
    echo "$date is the last Sunday of the month!"
fi
Run Code Online (Sandbox Code Playgroud)

测试:

$ ./330571.sh 2016-12-01
$ ./330571.sh 2016-12-04
$ ./330571.sh 2016-12-25
2016-12-25 is the last Sunday of the month!
$ ./330571.sh 2017-01-28
$ ./330571.sh 2017-01-29
2017-01-29 is the last Sunday of the month!
Run Code Online (Sandbox Code Playgroud)