Fecha aritmética formando en Bash

6

Tengo un script que crea las carpetas de la semana anterior con el número de la 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 WEEKNBR está en una forma de dos dígitos, por ejemplo. "Week05" pero el PREVWK sería "WEEK4".
¿Cómo restaría 1 de WEEKNBR y el resultado irá precedido de 0 cuando corresponda?

    
pregunta Logiclust 17.01.2018 - 00:00

4 respuestas

6

Puedes usar date para hacer la aritmética por ti. Con fecha BSD:

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

Desde 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é utilizando la fecha de GNU:

$ date -d '-1week' +%V
02
$ date -d '-1 week' +%V
02
$ date -d 'now - 1 week' +%V
02
$ date -d 'last week' +%V
02
    
respondido por el muru 17.01.2018 - 03:35
2

Un "one-liner" (OK, dos-liner) es

WEEKNBR=$(date +"%V")
PREVWK=$(printf %02d $((WEEKNBR-1)))
    
respondido por el klanomath 17.01.2018 - 00:53
1

Creo que lo que está buscando aquí es una forma de verificar si $PREVWK tiene 2 dígitos o no, en cuyo caso, respectivamente, debe agregar un prefijo 0 al 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

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

Hazme saber si eso funciona para ti o si estás buscando otra forma de lograrlo. También puede verificar si el número en su totalidad es menor que 10, lo que significa que es necesario agregar un 0 inicial.

    
respondido por el ProGrammer 17.01.2018 - 00:32
1

Un enfoque de línea única que no se interrumpirá cuando llegue el nuevo año y que siempre dé el número de semana correcto 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:

P.S .: 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 actualizarla.

    
respondido por el Wildcard 17.01.2018 - 05:49

Lea otras preguntas en las etiquetas