2

我正在执行以下代码。我不确定为什么计算是以八进制进行的?我怎样才能使这段代码更好?

#!/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")
4

2 回答 2

1

这个怎么样?

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

我不确定为什么计算是以八进制进行的

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

希望这可以帮助!

于 2013-07-01T22:27:58.223 回答
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
于 2013-07-01T22:43:15.790 回答