Formateo aritmético de fechas en Bash

Tengo un script que crea las carpetas de la semana anterior con el número de semana en el nombre. Así es como obtengo el valor del número de la semana actual y asigno el número de la semana anterior.

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

El valor de WEEKNBRestá en forma de dos dígitos, por ejemplo. "Semana05" pero PREVWKsería "SEMANA4".
¿Cómo haría para restar 1 WEEKNBRy hacer que el resultado sea precedido por 0cuando corresponda?

¿Tiene la intención de dejar de usar este script antes de fin de año? ¿Qué sucede cuando PREVWK termina en 0?

Respuestas (4)

Puede utilizar datepara hacer la aritmética para usted. Con fecha BSD:

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

de 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.

En caso de que haya instalado y esté usando GNU date:

$ date -d '-1week' +%V
02
$ date -d '-1 week' +%V
02
$ date -d 'now - 1 week' +%V
02
$ date -d 'last week' +%V
02
Mejor respuesta, de lo contrario, ¿qué resultado quieres en la semana 1 del año?
para el caso de la semana uno que tengo.if [[ $PREVWK == 0 ]] . then . PREVWK=52 . YEAR=$((YEAR-1)) . # echo 'prevwk:' $PREVWK . # echo 'prevyear:' $YEAR . fi

Una "una sola línea" (OK, dos líneas) es

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

Creo que lo que busca aquí es una forma de verificar si $PREVWKtiene 2 dígitos o no, en cuyo caso, respectivamente, antepone una 0al comienzo del número existente o no.

Implementación:

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

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

Mira el número de dígitos en la variable (asegúrese de que siempre sea un número) y decide si se compone de menos de 2 dígitos. Si es así, antepone 0, de lo contrario, deja el número solo. De esta manera, las semanas 23permanecerán como 23en lugar de 023, y así sucesivamente.

Avíseme si eso funciona para usted o si está buscando otra forma diferente de lograrlo. También puede verificar si el número en su conjunto es menor que 10, lo que significa 0que se debe agregar un líder.

La terminal es para la aplicación de la terminal, no para las preguntas generales de la línea de comandos. Gracias por la excelente edición y, lo que es más importante, la buena respuesta que explica las cosas.

Un enfoque de una sola línea que no se romperá cuando llegue el año nuevo y que siempre proporcione el número de semana correcto durante siete días antes del momento actual:

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

Tenga en cuenta que estoy usando nombres en minúsculas porque no son (o no deberían ser) variables de entorno; ver:


PD: Veo que muru ha escrito una respuesta esencialmente idéntica, pero tuve esta pestaña abierta durante algunas horas antes de volver a ella y me olvidé de actualizar.