А ты настроил? 😲
Вот так вот и живем, а сегодня Tagd Tagd снова в тренде 👇
—
Сегодня (01.08.2024) запускаю скрипт архивирования и получаю сообщение об ошибке:
bash: declare: 08: слишком большое значение для основания (неверный маркер «08»)
Скрипт, написанный и работающий с 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: line 2: function strftime never defined
Поверяю версии
awk. У меня на машине gawk, на серваке mawk.Блин, это уже вызов.
mawk - не gawk и у него отсутствуют функции времени и даты (ну, по крайней мере в той версии).Но, решение есть.
declare -i MON=$(date "+%m"|awk '{print $1+=0}')Странная инструкция
$1+=0 позволяет преобразовать строковое представление числа в первой колонке в числовое.Ну, собственно все. В коментах надеюсь увидеть другие варианты решения проблемы.
tags: #linux
—
🔔 @bashdays