6 votos

Formación aritmética de fechas en Bash

Tengo un script que crea las carpetas de la semana anterior con el número de la semana en el nombre. Así es como estoy obteniendo el valor del número de la semana actual y asignando 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 se puede restar 1 a WEEKNBR y que el resultado vaya precedido de 0 ¿cuándo es aplicable?

0 votos

¿Piensas dejar de usar este script antes de que acabe el año? ¿Qué sucede cuando PREVWK termina como 0?

7voto

Hakunka-Matata Puntos 1

Puede utilizar 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 hayas instalado y estés 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

1 votos

La mejor respuesta, si no, ¿qué resultado quieres en la primera semana del año?

0 votos

Para el caso de la semana uno tengo . if [[ $PREVWK == 0 ]] . then . PREVWK=52 . YEAR=$((YEAR-1)) . # echo 'prevwk:' $PREVWK . # echo 'prevyear:' $YEAR . fi

2voto

klanomath Puntos 19587

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

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

1voto

ProGrammer Puntos 64

Creo que lo que se busca aquí es una forma de comprobar si $PREVWK es de 2 dígitos o no, en cuyo caso se añade respectivamente un 0 al principio del número existente o no.

La puesta en práctica:

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 de la variable (asegúrate de que siempre es un número) y decide si está formada por menos de 2 dígitos. Si es así, añade 0 Si no, deja el número solo. De esta manera, semanas como 23 se mantendrá como 23 en lugar de 023 y así sucesivamente.

Dime si eso te funciona o si buscas otra manera de lograrlo. También podría comprobar si el número en su conjunto es menor que 10, es decir, un 0 hay que añadir.

1 votos

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

1voto

Wildcard Puntos 121

Un enfoque de una sola línea que no se rompa cuando llegue el año nuevo y que siempre da el número de semana correcto para los siete días anteriores al momento actual:

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

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


P.D.: 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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X