Datumsarithmetische Formatierung in Bash

Ich habe ein Skript, das die Ordner der vorherigen Woche mit der Wochennummer im Namen erstellt. So erhalte ich den Wert der aktuellen Wochennummer und weise die Nummer der vorherigen Woche zu.

WEEKNBR=$(date +"%V")
PREVWK=$((WEEKNBR-1))

Der Wert von WEEKNBRist zweistellig, z. "Week05", aber das PREVWKwäre "WEEK4".
Wie würde man 1 subtrahieren WEEKNBRund dem Ergebnis ggf. voranstellen 0?

Beabsichtigen Sie, dieses Skript vor Ende des Jahres nicht mehr zu verwenden? Was passiert, wenn PREVWK als 0 endet?

Antworten (4)

Sie können verwenden date, um die Arithmetik für Sie zu erledigen. Mit BSD-Datum:

$ /bin/date +%V
03
$ /bin/date -v-1w +%V
02

Von man date:

-v   Adjust (i.e., take the current date and display the result of the
     adjustment; not actually set the date) the second, minute, hour,
     month day, week day, month or year according to val.  If val is
     preceded with a plus or minus sign, the date is adjusted forwards
     or backwards according to the remaining string, otherwise the
     relevant part of the date is set.  The date can be adjusted as
     many times as required using these flags.  Flags are processed in
     the order given.

Falls Sie GNU date installiert haben und verwenden:

$ date -d '-1week' +%V
02
$ date -d '-1 week' +%V
02
$ date -d 'now - 1 week' +%V
02
$ date -d 'last week' +%V
02
Beste Antwort, sonst, welches Ergebnis willst du in Woche 1 des Jahres?
für die Woche habe ich einen Fall.if [[ $PREVWK == 0 ]] . then . PREVWK=52 . YEAR=$((YEAR-1)) . # echo 'prevwk:' $PREVWK . # echo 'prevyear:' $YEAR . fi

Ein "Einzeiler" (OK, Zweizeiler) ist

WEEKNBR=$(date +"%V")
PREVWK=$(printf %02d $((WEEKNBR-1)))

Ich denke, was Sie hier suchen, ist eine Möglichkeit zu überprüfen, ob $PREVWK2 Ziffern lang sind oder nicht. In diesem Fall stellen Sie entweder ein 0am Anfang der vorhandenen Nummer ein oder nicht.

Implementierung:

WEEKNBR=$(date +"%V")
PREVWK=$((WEEKNBR-1))

if [[ $(echo -n ${PREVWK} | wc -c) -lt 2 ]] ; then
    PREVWK="0${PREVWK}"
fi

Es betrachtet die Anzahl der Ziffern in der Variablen (stellen Sie sicher, dass es immer eine Zahl ist) und entscheidet, ob sie aus weniger als 2 Ziffern besteht. Wenn dies der Fall ist, wird vorangestellt 0, andernfalls wird die Nummer in Ruhe gelassen. 23Auf diese Weise bleiben Wochen wie 23anstelle von 023und so weiter.

Lassen Sie mich wissen, ob das für Sie funktioniert oder ob Sie nach einem anderen/anderen Weg suchen, dies zu erreichen. Sie können auch überprüfen, ob die Zahl insgesamt kleiner als 10 ist, was bedeutet, dass ein führender 0Wert hinzugefügt werden muss.

Terminal ist für Terminal-Apps gedacht, nicht für allgemeine Befehlszeilenfragen. Vielen Dank für die hervorragende Bearbeitung und vor allem die gute Antwort, die die Dinge erklärt.

Ein Einzeiler-Ansatz , der nicht bricht, wenn das neue Jahr herumrollt und der immer die richtige Wochennummer für sieben Tage vor dem aktuellen Moment angibt:

weeknbr="$(date +%V)"
prevwk="$(date -j -v -7d +%V)"

Beachten Sie, dass ich Kleinbuchstaben verwende, da dies keine Umgebungsvariablen sind (oder nicht sein sollten); sehen:


PS: Ich sehe, dass muru eine im Wesentlichen identische Antwort geschrieben hat, aber ich hatte diese Registerkarte einige Stunden lang geöffnet, bevor ich darauf zurückkam, und es versäumt, sie zu aktualisieren.