Последние новости — в Москве госпитализировали мужика, который не смог настроить 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}')
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Странная инструкция $1+=0 позволяет преобразовать строковое представление числа в первой колонке в числовое.

Ну, собственно, всё. В комментариях надеюсь увидеть другие варианты решения проблемы.