Значение слишком велико для базы (токен ошибки "0925")
У меня есть следующая логика в моем скрипте bash:
#!/bin/bash
local_time=$(date +%H%M)
if (( ( local_time > 1430 && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
# do something
fi
Время от времени я получаю ошибку, указанную в заголовке (в любое время выше 08xx
появляется, чтобы вызвать ошибку).
Любые предложения о том, как это исправить?
Я работаю на Ubuntu 10.04 LTS
[Редактировать]
Я изменил скрипт в соответствии с предложением SiegeX, и теперь я получаю сообщение об ошибке: [: 10#0910: integer expression expected
,
Любая помощь?
3 ответа
bash
рассматривает ваши числа как восьмеричные из-за нуля в начале
От man bash
Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричное. В противном случае числа принимают форму [base#]n, где base - это десятичное число от 2 до 64, представляющее арифметическую базу, а n - это число в этой базе. Если base # опущен, используется base 10.
Чтобы это исправить, укажите префикс base-10
#!/bin/bash
local_time="10#$(date +%H%M)"
if (( ( local_time > 1430 && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
# do something
fi
Следуя совету из этого блога, это работает:
#!/bin/bash
local_time=`date +%H%M`
local_time="$(( 10#$local_time ))"
if (( ( local_time > 1430 && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
echo "it is time!"
fi
Решение проблемы в рамках условного теста
Можно заставить переменную оставить такой, какой она есть, по ряду причин (например, из-за проблем с именами файлов). Если это так, решите проблему в рамках условного теста , явно указав 10#
:
#!/bin/bash
local_time=$(date +%H%M)
if (( ( 10#${local_time} > 1430 && 10#${local_time} < 2230 ) || ( 10#${local_time} > 0300 && 10#${local_time} < 0430 ) )); then
# do something
fi