入出力エラー:
14:00:11,320 14:00:11,453
**Correct Output** : Time difference is 133 milli seconds.
14:00:13,097 14:00:13,124
**Output in Error** : line 4: 124000000 - 097000000: value too great for base (error token is "097000000")
14:00:11:693 14:00:13:048
**Output in Error** : line 4: 048000000: value too great for base (error token is "048000000")
使用されたスクリプト:
g=$(( $(date -d $b +%s) - $(date -d $a +%s) ))
h=$(( $(date -d $b +%N) - $(date -d $a +%N) ))
k=$(( (g * 1000) + (h / 1000000) ))
printf "Total time difference: %i milli seconds\n" $k
答え1
0
あなたは正しいです。この数学はbashと他のほとんどのシェルで失敗します。なぜなら、数字は次に始まるCルールに従うからです。8進数、10進数ではありません:
$ echo "$((124000000 - 097000000))"
bash: 124000000 - 097000000: value too great for base (error token is "097000000")
1つの解決策は、bashする数値をデフォルトの10として正しく識別することです。
$ echo "$((10#124000000 - 10#097000000))"
27000000
問題は、10#
接頭辞がない場合、bashはゼロで始まる数字を8進数と仮定することです。
または以下を使用してくださいbc
。
$ echo "124000000 - 097000000" | bc -l
27000000
またはawkを使用してください:
$ echo "124000000 097000000" | awk '{print $1-$2}'
27000000
数学とprintfを組み合わせる:
$ g=124000000
$ h=097000000
$ printf "Total time difference: %i milli seconds\n" "$(echo "$g - $h" | bc -l )"
Total time difference: 27000000 milli seconds
または、
$ g=124000000
$ h=097000000
$ echo "$g $h" | awk '{printf "Total time difference: %i milliseconds\n",$1-$2}'; )
Total time difference: 27000000 milli seconds
文書
からman bash
:
0で始まる定数は8進数として解釈されます。前に0xまたは0Xがある場合は、16進数を表します。それ以外の場合、数値は [base#]n 形式を取ります。ここで、オプションの下は算術の下を表す2〜64の10進数で、nはその下の数字です。
数学と日付の組み合わせ
$ echo "$(( $(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N') ))"
27000000
ナノ秒をミリ秒に変換するには:
$ echo "$(( ($(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N'))/1000000 ))"
27
$ echo "$(( ($(date -d '14:00:05.320' '+10#%s%N') - $(date -d '14:00:04.909' '+10#%s%N'))/1000000 ))"
411