2014-01-10 26 views
26

當運行我的bash腳本的這一部分我得到一個錯誤擊錯誤:值太大,基地(錯誤標記爲 「09」)

腳本

value=0 
for ((t=0; t <= 4; t++)) 
do 
d1=${filedates[$t]} 
d2=${filedates[$t+1]} 
((diff_sec=d2-d1)) 
SEC=$diff_sec 
compare=$((${SEC}/(60*60*24))) 
value=$((value+compare)) 
done 

輸出

jad.sh: line 28: ((: 10#2014-01-09: value too great for base (error token is "09") 
jad.sh: line 30: /(60*60*24): syntax error: operand expected (error token is "/(60*60*24)") 

d1和d2是這種形式的日期2014-01-09和2014-01-10

任何解決方案,請?

+1

你不能只減去形式YYYY-MM-DD日期。你必須先將它們轉換爲普通數字,比如time_t時間戳(這會讓你幾秒鐘)。 –

+2

看起來它會將你的09轉換爲八進制符號,所以很可能實際上是在計算'2014-1-9',但由於'09'不是有效的數字(前面的0表示使用八進制而不是十進制)這是抱怨。 – robbrit

+0

什麼解決robbirt? – user3178889

回答

37

前置字符串「 10#「放在變量的前面。這迫使bash將它們當作十進制來處理,儘管前導零通常會使它們變成八進制。

0

您不需要${}arithmetic expansion表達式中。它應該看起來像這樣:

compare=$((SEC/(60*60*24))) 
+0

解決了第二個錯誤。仍然是第一個錯誤「價值太大了基地..」 – user3178889

+0

作爲@robbrit說,從'09'去掉前導零或更好地修復產生'09'的代碼。否則它被視爲一個八進制數。 (或檢查dogbane的答案) – hek2mgl

9

什麼是d1d2?他們是日期還是秒?

通常,如果您嘗試使用包含零前綴的數字進行算術運算,則會發生此錯誤。 09.

實施例:

$ echo $((09+1)) 
-bash: 09: value too great for base (error token is "09") 

爲了與0前綴號碼執行算術需要告知的bash通過指定10#使用鹼-10:

$ echo $((10#09+1)) 
10 
+1

如果我有一個變量持有$日期= 2014-01-09 使用10#將無濟於事。 – user3178889

2

d1 and d2 are dates in that form 2014-01-09 and 2014-01-10

然後

((diff_sec=d2-d1)) 

你期望得到? ((diffsec=2014-01-09-2014-01-10)) ??

您需要的日期先轉換成秒:

d1=$(date -d "${filedates[$t]}" +%s) 
d2=$(date -d "${filedates[$t+1]}" +%s) 
((compare = (d2 - d1)/(60*60*24))) 
((value += compare))