我正在执行以下代码。我不确定为什么计算在八进制中发生?如何让这段代码更好?
#!/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")
答案 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