2014-01-10 5 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を8進表記に変換しているようですが、実際には '2014 - 1-9'を計算しようとしていますが、' 09'は有効な数字ではありません(正面の0は10進数ではなく8進数を使用することを意味します)それは不平を言っている。 – robbrit

+0

ソリューションrobbirtは何ですか? – user3178889

答えて

37

前に付加文字列 " 10# "を変数の先頭に追加します。これは、先行するゼロが通常は8進数にしても、bashに小数点として扱うよう強制します。

0

あなたはarithmetic expansion式の${}を必要としません。それは次のようになります。

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

これは2番目のエラーを解決します。まだ最初のエラー "ベースでは大きすぎる値" – user3178889

+0

@robbritによると、 '09'から先行ゼロを削除するか、' 09'を生成するコードを修正する方が良いでしょう。それ以外の場合は、8進数として扱われます。 (またはドッグベーンの答えをチェックしてください) – hek2mgl

9

d1d2何ですか?日付は何秒ですか?

一般に、このエラーはゼロ接頭辞を含む数字で算術演算を実行しようとしている場合などに発生します。 09.

例:あなたは10#を指定することにより、ベース-10を使用するためにはbashを伝える必要があり0・先頭に数字で算術演算を実行するために

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

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

$ date = 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)) 
関連する問題