2013-07-01 24 views
2

我正在執行以下代碼段。我不確定爲什麼計算是以八進制形式發生的?我怎樣才能讓這段代碼更好?算術錯誤 - 以8爲底的計算

#!/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

不能重複這個問題,慶典的什麼版本? – michael501

+0

礦是bash-3.00。我猜你是否得到這個問題將取決於localhour/gmthour是否已經領先零。 – misguided

回答

1

前導零是什麼導致數字被解釋爲八進制。從man bash報價:

算術求
[...]
常量與一家領先的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 
+0

它會如何破壞。你能否詳細說明一下? – misguided

+0

謝謝你指出 – misguided

1

這個怎麼樣?

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

我不知道爲什麼計算在八進制發生

只是因爲當有一個前導零,這個數字被解釋爲基數8是爲了防止這種情況,你可以用10#強制shell以10爲基數解釋數字。但看到你的評論,讓我強調,在這種情況下,你必須明確使用美元符號。

希望這會有所幫助!

+0

已經嘗試過這樣做,得到'MyFile.ksh:line 6:10#gmthour:value對於base來說太好了(error token是「10#gmthour」)' – misguided

+1

@misguided觀看美元符號! –

+0

謝謝隊友。在嘗試代碼時錯過了指定的美元符號。 Onc ethe標誌又回來了。問題已解決。 – misguided