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

时间:2014-01-10 16:45:52

标签: 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

输出

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

中的日期

有任何解决方案吗?

7 个答案:

答案 0 :(得分:47)

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

答案 1 :(得分:13)

什么是d1d2?是日期还是秒?

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

示例:

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

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

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

答案 2 :(得分:3)

  

d1和d2是2014-01-09和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 ))

答案 3 :(得分:1)

正如其他人所说,错误是由 Bash 将前导零解释为八进制数的数字序列造成的。如果您可以控制创建日期值的过程并且您正在使用 date,则可以使用连字符作为输出格式字符串的前缀以删除前导零填充。在本例中,我假设您在 09:00 运行此命令。

不带连字符前缀 date 格式:

$ if (( $(date +%H) < 10 )); then echo true; else echo false; fi
-bash: ((: 09: value too great for base (error token is "09")
false

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

$ if (( $(date +%-H) < 10 )); then echo true; else echo false; fi
true

来自 date 手册页:

<块引用>

默认情况下,日期用零填充数字字段。以下 可选标志可以跟在“%”之后:

  -      (hyphen) do not pad the field

答案 4 :(得分:0)

arithmetic expansion表达式中不需要${}。它应该是这样的:

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

答案 5 :(得分:0)

以下代码出现相同的错误,我不知道为什么,但是已经解决了:

24    echo $currentVersion
25    if [[ $currentVersion -eq "" ]];then
26       echo "$projectName=$version">>$modulepath
27    else
28       sed  -i "s/^$projectName=$currentVersion/$projectName=$version/g"  $modulepath
29    fi

错误信息:

b26044fb99c28613de9903db3a50cbb11f0de9c7 1e5d11c9923045cc43f5fdde07f186b6dd5ca1b4
/data/ext/tbds_ci_build/tbds_build_common.sh: line 25: [[: b26044fb99c28613de9903db3a50cbb11f0de9c7
1e5d11c9923045cc43f5fdde07f186b6dd5ca1b4: value too great for base (error token is "1e5d11c9923045cc43f5fdde07f186b6dd5ca1b4")
sed: -e expression #1, char 63: unterminated `s' command

修复:

Make $currentVersion do not contain 2 values like "a b", just 1 value "a" .

答案 6 :(得分:0)

对于日期中的“ mm”和“ dd”值,我使用此技巧:

mm="1${date:5,2}"  # where 5 is the offset to mm in the date
let mm=$mm-100     # turn 108 into 8, and 109 into 9