
我嘗試在 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) ]]