我尝试在 ESXI 上编写脚本,我需要添加“如果该月的最后一个星期日”。我尝试
date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
它不能工作,但在 Debian 上可以工作。
在 ESXI 上现在输出 August
答案1
我相信问题是
给定一个特定日期,我可以确定它是否是该月的最后一个星期日吗?
而不是更普遍的问题
给定一个特定的月份,它的最后一个星期日是哪一天?
鉴于此,我们可以将问题分为两部分:
- 日期是星期日吗?
- 是这个月的最后一周吗?
对于第一部分,测试很简单:
date -d "$date" +%a # outputs "Sun" for a Sunday
我们可以测试一下:
test $(date -d "$date" +%a) = Sun # success if $date is a Sunday
现在,为了测试是否是该月的最后一周,我们可以在日期上添加一周,看看这是否为我们提供了下个月的前 7 天之一:
test $(date -d "$date + 1week" +%e) -le 7
由于 的工作日$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
测试:
$ ./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!
答案2
您可以使用 和 来执行此cal
操作awk
:
$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25
解释
cal
打印当前月份,并将星期日作为第一列(默认情况下):
$ cal
December 2016
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
该awk
命令匹配以零个或多个空格开头,后跟一个数字的行,并将第一个字段存储到变量中d
。最后,d
将是当月的最后一个星期日。
答案3
我在尝试获取最后星期四时发现了这篇文章,但它也适用于其他任何一天。这是我的解决方案(与 Bash 兼容):
thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...
本质上,它检查下周的某一天是否出现在同一个月。应该适用于 12 月/1 月过渡,因为我使用的-ne
是-ge
or -gt
。
答案4
对于该月的最后一个星期日:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]
对于该月的第一个星期日:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]