Date la formattazione aritmetica in Bash

6

Ho uno script che crea le cartelle della settimana precedente con il numero della settimana nel nome. Ecco come ottengo il valore del numero della settimana corrente e l'assegnazione del numero della settimana precedente.

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

Il valore di WEEKNBR è in una forma a due cifre es. "Week05", ma PREVWK sarebbe "WEEK4".
Come fare per sottrarre 1 da WEEKNBR e avere il risultato preceduto da 0 quando applicabile?

    
posta Logiclust 17.01.2018 - 00:00
fonte

4 risposte

6

Puoi usare date per fare l'aritmetica per te. Con data BSD:

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

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

Se hai installato e stai usando la data di 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
    
risposta data 17.01.2018 - 03:35
fonte
2

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

WEEKNBR=$(date +"%V")
PREVWK=$(printf %02d $((WEEKNBR-1)))
    
risposta data 17.01.2018 - 00:53
fonte
1

Penso che quello che stai cercando qui è un modo per verificare se $PREVWK è di 2 cifre o meno, nel qual caso tu rispettivamente anteponi un 0 all'inizio del numero esistente o meno.

Implementazione:

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

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

Guarda il numero di cifre nella variabile (assicurati che sia sempre un numero) e decida se è composto da meno di 2 cifre. Se è così, prepara 0 , altrimenti lascia il numero da solo. In questo modo, settimane come 23 rimarranno come 23 anziché 023 , e così via.

Fammi sapere se questo funziona per te o se stai cercando un altro / diverso modo per raggiungerlo. Puoi anche controllare se il numero nel suo complesso è inferiore a 10, il che significa che è necessario aggiungere un 0 iniziale.

    
risposta data 17.01.2018 - 00:32
fonte
1

Un approccio a un solo liner che non si interrompe quando il nuovo anno si avvicina e che fornisce sempre il numero di settimana corretto per sette giorni prima del momento corrente:

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

Si noti che sto usando nomi in minuscolo perché non sono (o non dovrebbero essere) le variabili di ambiente; vedi:

P.S .: Vedo che muru ha scritto una risposta essenzialmente identica, ma ho avuto questa scheda aperta per alcune ore prima di tornare ad essa e ho dimenticato di aggiornare.

    
risposta data 17.01.2018 - 05:49
fonte

Leggi altre domande sui tag