Jetzt führe ich schon Selbstgespräche ... On Mit, 31 Jul 2002 at 21:10 (+0200), Jan Trippler wrote:
On Mit, 31 Jul 2002 at 10:31 (+0200), Christoph Maurer wrote: [...]
30. Juni, aber 30. Juli -1month darf auch nur 30.Juni ergeben,
ich seh schon, das ist nicht trivial und läßt sich über das fixe Abziehen von Tagen nur sehr unbefriedigend lösen...
Wir hatten das IIRC vor langer Zeit schon mal auf der Liste. date rechnet IMHO immer mit 30 Tagen.
Wenn man immer den korrekten Monat braucht, sollte man mit einem Tag in der Mitte rechnen: for mon in `seq 1 12`; do date +%Y%m -d "`date +\"%b 15\"` -$mon month" done [...]
Mir ist gerade noch eingefallen: Wenn man es sich richtig schön machen will und den aktuellen Tag (- x Monate) in der Ausgabe noch mit drin haben will: for mon in `seq 1 12`; do date +%Y%m`date +%d` -d "`date +\"%b 15\"` -$mon month" done wobei der aufmerksame Beobachter gerade bei Tagen am Monatsende leicht ein paar Ungereimtheiten feststellen kann: 20020231 - *ups* Also muss man ein klein wenig mehr Aufwand treiben (ich gehe mal davon aus, dass man dann lieber den letzten des Monats angezeigt kriegen will): for mon in `seq 1 12`; do ymd=`date +%Y%m\`date +%d\` -d "\`date +\"%b 15\"\` -$mon month"` test `date +%Y%m%d -d $ymd` = $ymd || \ ymd=`date +%Y%m%d -d "\`date +\"%b 01\"\` -\`expr $mon - 1\` \ month -1 day"` echo $ymd done Damit kriegt man immer den gleichen Tag des Monats in den Vormonaten oder den letzten Tag des entspr. Monats, wenn das wie heute - ähm, gestern - ein Tag ist, den sie nicht alle haben. Das kann man schön testen, wenn man die Schleife mal etwas modifiziert: for mon in `seq 1 12`; do ymd=`date +%Y%m31 -d "\`date +\"%b 15\"\` -$mon month"` # ^^ hier irgendeinen Wert zwischen 29 und 31 # einsetzen test `date +%Y%m%d -d $ymd` = $ymd || \ ymd=`date +%Y%m%d -d "\`date +\"%b 01\"\` -\`expr $mon - 1\` \ month -1 day"` echo $ymd done *Shell macht Laune* :-) Jan