Um abseits von cron in einem Shellskript den letzten Tag eines beliebigen Monats zur Verfügung zu haben, habe ich mir eine
function einfallen lassen. Schaltjahre sind so z.B. kein Problem mehr.
Folgendes Skript (ultimo.sh) ist zum Testen gedacht. Es erwartet genau zwei Parameter: den Monat (zweistellig) und das Jahr (vierstellig).
#!/bin/bash
month=$1
year=$2
function ultimo ()
{
lastsec=$(echo $(( `date -d ${year}${month}01 +%s` -1)) )
lastday=$(echo $lastsec | gawk '{print strftime("%d",$1)}' )
echo $lastday ist der letzte Tag des Vormonats von $month im Jahr $year
}
ultimo
exit 0
Aufgerufen wird es so:
ultimo.sh 03 2002
Ergebnis: 28 ist der letzte Tag des Vormonats von 03 im Jahr 2002
Was so viel bedeutet wie "der Februar 2002 hatte 28 Tage"
Die Idee dahinter ist einfach: Ich nehme den ersten Tag des Folgemonats, Sekunde 0, und ziehe davon eine Sekunde ab.
Konkretere Beispiele:
• Wenn ich aus irgendeinem umfangreichen Logfile den genauen Monat automatisiert extrahieren möchte, brauche ich den ersten und letzten Tag des Monats.
• SARG (Squid Analysis Report Generator) erwartet zum Auswerten eines Monats die Option
"-d 01/MM/YYYY-letzterTag/MM/YYYY"
Update: Micha Holzmann ist über diesen Beitrag gestolpert und hat das Ganze an seine Anforderungen angepasst.
Achtung, hier wird der letzte Tag des abgefragten Monats ausgegeben, nicht der des Vormonats wie oben.
#!/bin/bash
month=$1
year=$2
function ultimo ()
{
lastday=$(date -d "${year}-${month}-01 +1 month -1 day" +%d)
echo $lastday ist der letzte Tag des Monats ${month}/${year}
}
ultimo
exit 0
Hier wird auf gawk ganz verzichtet, somit ist date das einzige externe Programm, das benötigt wird.