基数值太大(错误标记为"09")

use*_*889 37 bash

运行我的bash脚本的这一部分时出现错误

脚本

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
Run Code Online (Sandbox Code Playgroud)

产量

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)")
Run Code Online (Sandbox Code Playgroud)

d1和d2是2014-01-09和2014-01-10中的日期

有解决方案吗?

roj*_*oke 49

将字符串"10#"添加到变量的前面.这迫使bash将它们视为十进制,即使前导零通常会使它们成为八进制.


dog*_*ane 13

什么是d1d2?他们是约会还是秒?

通常,如果您尝试使用包含零前缀的数字(例如09)进行算术运算,则会发生此错误.

例:

$ echo $((09+1))
-bash: 09: value too great for base (error token is "09")
Run Code Online (Sandbox Code Playgroud)

为了使用带有0前缀的数字执行算术,您需要通过指定来告诉bash使用base-10 10#:

$ echo $((10#09+1))
10
Run Code Online (Sandbox Code Playgroud)

  • 如果我有使用10#持有$ date = 2014-01-09的变量,则将无益。 (2认同)

enh*_*nic 11

正如其他人所说,该错误是由于 Bash 将带有前导零的数字序列解释为八进制数而导致的。如果您可以控制创建日期值的过程并且正在使用date,则可以在输出格式字符串前添加连字符以删除前导零填充。

不使用连date字符作为格式前缀:

$ (( $(date --date='9:00' +%H) < 10 )) && echo true || echo oops
-bash: ((: 09: value too great for base (error token is "09")
oops
Run Code Online (Sandbox Code Playgroud)

使用date带有连字符的前缀格式:

$ (( $(date --date='9:00' +%-H) < 10 )) && echo true || echo oops
true
Run Code Online (Sandbox Code Playgroud)

date手册页:

默认情况下,日期用零填充数字字段。'%' 后面可以有以下可选标志:

  -      (hyphen) do not pad the field
Run Code Online (Sandbox Code Playgroud)