Последние новости — в Москве госпитализировали мужика, который не смог настроить GoodbyeDPI и похавал без ютуба.
А ты настроил?
Вот так вот и живём, а сегодня Tagd снова в тренде.
Сегодня (01.08.2024) запускаю скрипт архивирования и получаю сообщение об ошибке:
Скрипт, написанный и работающий с 02.02.24 г., вдруг перестал работать.
Чудеса?
Лезу, смотрю, где ошибка.
declare -i MON=$(date +%m)
Мне нужен просто номер месяца для контроля, какой накопитель должен быть примонтирован.
Начинаю выяснять. Оказывается, числа, начинающиеся с 0, Bash считает восьмеричными. Понятное дело, 08 для восьмеричной системы великовато.
Ну, решений проблемы море.
0. Самый правильный вариант (подсказал Alexey Kuznetsov)
declare -i MON=$(date "+%-m")
1. Классический вариант
declare -i MON=$((10#$(date "+%m")))
10# — система счисления. Роман об этом уже писал. Но читаемость (понимаемость) строки — так себе.
2. Более читаемый
declare -i MON=$(date "+%m" | sed 's/^0//')
Просто уберём ведущий 0, и проблема решена.
3. Решение на awk
Пробую, пробую на своей машине:
declare -i MON=$(awk 'BEGIN{m=+strftime("%m");print m}')
Работает. Встраиваю в скрипт — ошибка:
Проверяю версии awk. У меня на машине gawk, на серваке mawk.
Блин, это уже вызов. mawk — не gawk, и у него отсутствуют функции времени и даты (ну, по крайней мере в той версии).
Но решение есть.
declare -i MON=$(date "+%m" | awk '{print $1+=0}')
$1+=0 позволяет преобразовать строковое представление числа в первой колонке в числовое.Ну, собственно, всё. В комментариях надеюсь увидеть другие варианты решения проблемы.








Комментарии