2013-07-01 2 views
2

다음 코드를 실행 중입니다. 왜 계산이 8 진수에서 일어나는지 모르겠습니다. 이 코드를 어떻게 개선 할 수 있습니까?산술 오류 - 기초로 계산 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

이 문제의 bash의 버전을 복제 할 수 없습니다? – michael501

+0

광산은 bash-3.00입니다. 나는 당신이 이슈를 얻었는지 아닌지를 추측한다. localhour/gmthour가 0을 나타내는 지 여부에 의존한다. – misguided

답변

1

앞에 오는 0은 숫자가 8 진수로 해석되도록합니다. man bash에서 인용구 :

산술 평가
[...] 선두 0
상수는 8 진수로 해석됩니다. 선행하는 0x 또는 0X는 16 진수를 나타냅니다. 그렇지 않은 경우 숫자는 [base #] n 형식을 취합니다. 여기서 선택적 기본은 산술 자료를 나타내는 2에서 64 사이의 10 진수이고 n은 해당 기준의 숫자입니다. base #가 생략되면 base 10이 사용됩니다. %k 또는 %_Hdate 명령의 형식 문자열 앞에 0을 제거하는

변경 :

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

방법에 대해? 계산이 8 진수로 일어나는 이유

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

나는 확실하지 않다

앞에 0이 때, 수는 기수 8에있는 것은 그것을 방지하기 위해 해석되기 때문에 그냥, 당신이 할 수있는 쉘에 기수 10을 10#으로 해석하도록 명령하십시오. 그러나 귀하의 의견을보고,이 경우 달러 기호를 명시 적으로 사용해야한다는 점을 강조하겠습니다.

희망이 도움이됩니다.

+0

이미'MyFile.ksh : line 6 : 10 # gmthour : base (error 토큰 "10 # gmthour")' – misguided

+1

@misguided 달러 기호 조심해! –

+0

감사합니다. 코드를 시도하는 동안 지정된 달러 기호를 놓쳤습니다. Onc ethe sign이 (가) 다시 켜졌습니다. 문제가 해결되었습니다. – misguided