Базовая ошибка при попытке получить номер недели - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь получить номер недели прошлой недели. Следующая команда обычно работала, но теперь я получаю сообщение об ошибке.

lastweeknumber=$((`date +%V`-1))
bash: 09: value too great for base (error token is "09")

На этой неделе номер 09, поэтому я попытался преобразовать в десятичное число, добавив 10#, как это $(10#(date +%V)), но это не работает.

Как это исправить?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2020

Рассмотрим следующее, которое использует встроенную функциональность bash вместо внешней команды date и, таким образом, требует недавнего выпуска оболочки, но намного быстрее запускается (и будет работать согласованно, без зависимости от Speci c версия date).

После этого, однако, все еще есть необходимость удалить начальный 0 - что расширение параметра будет делать просто отлично:

printf -v seconds_now '%(%s)T' -1
printf -v weeknum_lastweek '%(%V)T' "$(( seconds_now - (60 * 60 * 24 * 7) ))"
echo "The index of last week is ${weeknum_lastweek#0}"
2 голосов
/ 24 февраля 2020

Это потому, что date +%V возвращает 09, а shell интерпретирует любое значение, начинающееся с 0, как восьмеричное число. Обратите внимание, что 09 является недопустимым восьмеричным числом, поэтому вы получаете эту ошибку value too great for base.

Вы можете просто принудительно ввести модуль 10 арифмети c в (( ... )):

echo $(( 10#$(date +%V) - 1 ))

8
1 голос
/ 24 февраля 2020

Другой способ, который правильно обрабатывает обертывание в течение года:

lastweeknumber=$(date -d "1 week ago" +%V)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...