算术错误 - 计算基数为8

时间:2013-07-01 22:26:13

标签: bash date-arithmetic octal

我正在执行以下代码。我不确定为什么计算在八进制中发生?如何让这段代码更好?

#!/bin/bash
gmthour=$(date -u +%H)
localhour=$(date +%H)
echo $gmthour
echo $localhour
tz=$(( gmthour - localhour ))
echo $tz

错误

22
08
MyFile.ksh: line 6: 08: value too great for base (error token is "08")

2 个答案:

答案 0 :(得分:1)

这个怎么样?

tz=$(( 10#$gmthour - 10#$localhour ))
  

我不确定为什么计算发生在八进制

仅仅因为当有一个前导零时,该数字被解释为基数为8.为了防止这种情况,您可以强制使用10#来解释基数为10的数字。但是看到你的评论,让我强调在这种情况下你必须明确使用美元符号。

希望这有帮助!

答案 1 :(得分:1)

前导零是导致数字被解释为八进制的原因。引自man bash

  

算术评估
  [...]
  前导0的常量被解释为八进制数。前导0x或0X表示十六进制。否则,数字采用[base#] n的形式,其中可选的基数是2到64之间的十进制数,表示算术基数,n是该基数中的数字。如果省略base#,则使用基数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