
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 + 1week
derselbe 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 cal
und tun awk
:
$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25
Erläuterung
cal
druckt 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 awk
Befehl 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 d
steht 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 -ne
anstelle von -ge
oder 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) ]]