
ESXIでスクリプトを書いてみましたが、「月の最終日曜日の場合」を追加する必要があります。
date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d
動作しませんが、Debian では動作します。
ESXIで8月を出力するようになりました
答え1
問題は
特定の日付が与えられた場合、それがその月の最後の日曜日かどうかを判断できますか?
より一般的な質問ではなく
特定の月の場合、その月の最後の日曜日は何日ですか?
これを踏まえると、問題を 2 つに分けることができます。
- 日付は日曜日ですか?
- 今月最後の週ですか?
最初の部分のテストは簡単です。
date -d "$date" +%a # outputs "Sun" for a Sunday
次のことをテストできます:
test $(date -d "$date" +%a) = Sun # success if $date is a Sunday
さて、それが月の最後の週であるかどうかをテストするには、日付に 1 週間を追加し、それが次の月の最初の 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
コマンドは、0 個以上のスペースで始まり、その後に数字が続く行に一致し、最初のフィールドを変数に格納しますd
。最後に、d
は現在の月の最後の日曜日になります。
答え3
最終木曜日を取得しようとしたときにこの記事を見つけましたが、他の曜日でも機能します。これが私の解決策です (Bash と互換性があります)。
thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...
本質的には、次の週の曜日が同じ月にあるかどうかをチェックします。または-ne
の代わりにを使用したので、12 月/1 月の遷移に機能するはずです。-ge
-gt
答え4
今月最後の日曜日:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]
毎月第 1 日曜日:
if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]