Начальный ноль - это то, что заставляет число интерпретироваться как восьмеричное. Цитата man bash
:
ARITHMETIC ОЦЕНКА
[...]
Константы, начинающиеся с 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричный. В противном случае числа принимают форму [base #] n, где необязательная база представляет собой десятичное число от 2 до 64, представляющее арифметическую базу, а n - число в этой базе. Если база # опущена, то используется база 10.
Изменить формат строки из date
команд %k
или %_H
, чтобы избавиться от ведущих нулей:
#!/bin/bash
gmthour=$(date -u +%k)
localhour=$(date +%k)
echo $gmthour
echo $localhour
tz=$((gmthour - localhour))
echo $tz
Помните, что ваш расчет будет перерыв при изменении день. Пример:
$ date
Di 2. Jul 00:50:29 CEST 2013
$ gmthour=$(date -u +%k)
$ localhour=$(date +%k)
$ echo $gmthour
22
$ echo $localhour
0
$ echo $((gmthour - localhour))
22
CEST явно не UTC + 22.
Попробуйте вместо этого:
#!/bin/bash
gmthour=$(date -u +%k)
localhour=$(date +%k)
echo $gmthour
echo $localhour
if [ $(date +%w) -eq $(date -u +%w) ]; then
tz=$((gmthour - localhour))
else
tz=$((24 - gmthour + localhour))
fi
echo $tz
не может дублировать этот вопрос, какую версию баш? – michael501
Шахта - bash-3.00. Я предполагаю, что вы получаете или не получаете проблему, зависящую от того, имеет ли localhour/gmthour лидирующий нуль или нет. – misguided