Дата арифметического форматирования в Баш

6

У меня есть скрипт, который создает папки предыдущей недели с номером недели в названии. Вот как я получаю значение номера текущей недели и присваиваю номер предыдущей недели.

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

Значение WEEKNBRв двухзначной форме, например. «Week05», но PREVWKбудет «WEEK4».
Как можно вычесть 1 из WEEKNBRи получить результат, 0если это применимо?

Logiclust
источник
Собираетесь ли вы прекратить использование этого сценария до конца года? Что происходит, когда PREVWK заканчивается как 0?
Wildcard

Ответы:

6

Вы можете использовать, dateчтобы сделать арифметику для вас. С датой BSD:

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

От 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.

Если вы установили и используете 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
Лучший ответ, в противном случае, какой результат вы хотите на первой неделе года?
Гленн Джекман
за неделю один случай у меня есть. if [[ $PREVWK == 0 ]] . then . PREVWK=52 . YEAR=$((YEAR-1)) . # echo 'prevwk:' $PREVWK . # echo 'prevyear:' $YEAR . fi
Logiclust
2

«Однострочник» (ОК, двухсторонний)

WEEKNBR=$(date +"%V")
PREVWK=$(printf %02d $((WEEKNBR-1)))
klanomath
источник
1

Я думаю, что вы после здесь, это способ проверить, если $PREVWKэто 2 цифры или нет, и в этом случае вы соответственно либо предшествуете a 0к началу существующего числа или нет.

Реализация:

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

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

Он просматривает количество цифр в переменной (убедитесь, что это всегда число) и решает, состоит ли он из менее 2 цифр. Если это так, он добавляется 0, иначе он оставляет число в покое. Таким образом, недели вроде 23останутся 23прежними 023, и так далее.

Дайте мне знать, если это работает для вас или вы ищете другой / другой способ достижения этого. Вы также можете проверить, если число в целом меньше 10, что означает, что 0необходимо добавить начальную букву.

Программист
источник
1
Терминал для приложения терминала, а не общие вопросы командной строки. Спасибо за отличное редактирование и, что более важно, хороший ответ, который объясняет вещи.
bmike
1

Единый подход , который не сломается, когда наступит новый год, и который всегда дает правильный номер недели за семь дней до текущего момента:

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

Обратите внимание, что я использую строчные имена, потому что они не являются (или не должны быть) переменными окружения; увидеть:


PS: я вижу, что muru написал по существу идентичный ответ, но я несколько часов открывал эту вкладку, прежде чем вернуться к ней, и не смог обновить ее.

Wildcard
источник