Значение слишком велико для базы (токен ошибки "0925") - PullRequest
12 голосов
/ 28 марта 2011

В моем скрипте 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 ]

15 голосов
/ 28 марта 2011

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
4 голосов
/ 11 сентября 2012

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

#!/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
1 голос
/ 29 февраля 2016

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

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