So erkennen Sie den letzten Sonntag im Monat

So erkennen Sie den letzten Sonntag im Monat

Ich versuche, ein Skript auf ESXI zu schreiben und muss "wenn letzter Sonntag im Monat" hinzufügen. Ich versuche

date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d

Es kann nicht funktionieren, aber es funktioniert unter Debian.

Auf ESXI wird jetzt August ausgegeben

Antwort1

Ich glaube, die Frage ist

Kann ich anhand eines bestimmten Datums feststellen, ob es der letzte Sonntag im Monat ist?

und nicht die allgemeinere Frage

Auf welchen Tag fällt in einem bestimmten Monat der letzte Sonntag?

Vor diesem Hintergrund können wir das Problem in zwei Teile aufteilen:

  • Ist das Datum ein Sonntag?
  • Ist es die letzte Woche des Monats?

Der erste Teil des Tests ist recht einfach:

date -d "$date" +%a  # outputs "Sun" for a Sunday

Wir können das testen:

test $(date -d "$date" +%a) = Sun  # success if $date is a Sunday

Um nun zu testen, ob es die letzte Woche des Monats ist, können wir dem Datum eine Woche hinzufügen und prüfen, ob wir dadurch einen der ersten 7 Tage des nächsten Monats erhalten:

test $(date -d "$date + 1week" +%e) -le 7

Da der Wochentag von $date + 1weekderselbe ist wie der von $date, können wir beide Teile des Tests in einem Durchgang generieren und einen Bash-Test mit regulären Ausdrücken verwenden:

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

Geprüft:

$ ./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!

Antwort2

Sie können dies mit calund tun awk:

$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25

Erläuterung

caldruckt den aktuellen Monat mit Sonntag als erste Spalte (standardmäßig):

$ 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

Der awkBefehl sucht nach Zeilen, die mit null oder mehr Leerzeichen beginnen, gefolgt von einer Ziffer, und speichert das erste Feld in der Variable d. Am Ende dsteht der letzte Sonntag des aktuellen Monats.

Antwort3

Ich habe diesen Artikel gefunden, als ich versucht habe, den letzten Donnerstag abzurufen, aber er würde auch für jeden anderen Tag funktionieren. Hier ist meine Lösung (kompatibel mit Bash):

thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...

Im Wesentlichen wird geprüft, ob der Tag der nächsten Woche im selben Monat liegt. Sollte für Dez./Jan.-Übergänge funktionieren, da ich -neanstelle von -geoder verwendet habe -gt.

Antwort4

Für den letzten Sonntag im Monat:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]

Für den ersten Sonntag im Monat:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]

verwandte Informationen