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

Преобразовать строку в целое число в скрипте bash - ошибка числа "Ведущий ноль"

В текстовом файле test.txt у меня есть следующая информация:

sl-gs5 desconnected Wed Oct 10 08:00:01 EDT 2012 1001

Я хочу выделить час события следующей командной строкой:

hour=$(grep -n sl-gs5 test.txt | tail -1 | cut -d' ' -f6 | awk -F ":" '{print $1}')

и я получил "08". Когда я пытаюсь добавить 1,

 14 echo $((hour+1))

Я получаю следующее сообщение об ошибке:

./test2.sh: line 14: 08: value too great for base (error token is "08")

Если переменные в Bash являются нетипизированными, почему?

4b9b3361

Ответ 1

См. АРИФМЕТИЧЕСКУЮ ОЦЕНКУ в man bash:

Константы с ведущим 0 интерпретируются как восьмеричные числа.

Вы можете удалить начальное отклонение по расширению параметра:

hour=${hour#0}

или интерпретация силы базы-10:

$((10#$hour + 1))

Ответ 2

что я бы назвал хаком, но, учитывая, что вы обрабатываете только значения за час, вы можете сделать

 hour=08
 echo $(( ${hour#0} +1 ))
 9
 hour=10 
 echo $(( ${hour#0} +1))
 11

с небольшим риском.

IHTH.

Ответ 3

Вы также можете использовать bc

hour=8
result=$(echo "$hour + 1" | bc)
echo $result
9

Ответ 4

Вот простой способ, хотя и не самый красивый способ получить значение int для строки.

hour=`expr $hour + 0`

Пример

bash-3.2$ hour="08"
bash-3.2$ hour=`expr $hour + 0`
bash-3.2$ echo $hour
8

Ответ 5

Как насчет sed?

hour=`echo $hour|sed -e "s/^0*//g"`

Ответ 6

Поскольку часы всегда положительные и всегда состоят из 2 цифр, вы можете установить 1 перед ним и вычесть 100:

echo $((1$hour+1-100))

что эквивалентно

echo $((1$hour-99))

Обязательно прокомментируй такую гимнастику. :)

Ответ 7

Ведущее 0 приводит к тому, что bash пытается интерпретировать ваш номер как восьмеричное число, но восьмеричные числа равны 0-7, а 8 - недопустимый токен.

Если бы я был вами, я бы добавил некоторую логику, чтобы удалить ведущее 0, добавить одно и снова добавить ведущее 0, если результат равен < 10.

Ответ 8

Вкратце: Для работы с числами Leading Zero(любая цифра 0, предшествующая первому ненулевому значению) в bash  - Используйте bc язык калькулятора произвольной точности

Пример:

a="000001"
b=$(echo $a | bc)
echo $b

Output: 1

Из руководства Bash:

"bc - это язык, который поддерживает числа произвольной точности с интерактивным исполнением        утверждений. Есть некоторые сходства в синтаксисе программирования на C lan-        Guage. Стандартная математическая библиотека доступна в командной строке. Если требуется,        математическая библиотека определяется до обработки любых файлов. bc начинает с обработки кода из        все файлы перечислены в командной строке в указанном порядке. После того, как все файлы имеют        обработано, bc читает из стандартного ввода. Весь код выполняется так, как он читается.        (Если файл содержит команду для остановки процессора, bc никогда не будет читать со стандартного ввода.) "