Подтвердить что ты не робот

Значение слишком велико для базы (маркер ошибки - "0925" )

У меня есть следующая логика в bash script:

#!/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

[изменить]

Я модифицировал script, как было предложено SiegeX, и теперь я получаю ошибку: [: 10#0910: integer expression expected.

Любая помощь?

4b9b3361

Ответ 1

bash обрабатывает ваши числа как восьмеричные из-за начального нуля

От man bash

Константы с ведущим 0 равны интерпретируется как восьмеричные числа. ведущий 0x или 0X обозначает шестнадцатеричный.        В противном случае числа принимают вид [base #] n, где base - десятичная число от 2 до 64,        в арифметической базе, а n - это число в этой базе. Если база # опущен, тогда используется база 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

Ответ 2

Следуя советам этого блога, это работает:

#!/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

Ответ 3

Решение проблемы в условном тесте

Можно принудительно сохранить переменную так же, как и по разным причинам (например, проблемы с именами файлов). Если это так, решите проблему в условном тесте , явно указав base 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