0%

踩坑:value to great for base

前几天启动的定时任务,有几个实例挂掉了。报错提示:

1
value too great for base (error token is "08")

出错的相关代码如下:

1
2
3
if [ $((${hour_s} + ${hour_diff})) -gt 23 ]; then
# foo bar
fi

这里 ${hour_s} 是当前标定时间的小时数。形如 00, 01, 02, ..., 08, 09, ..., 23${hour_diff} 是需要向后处理的小时数。这段代码的意图,是判断二者相加是否大于 23。若大于 23,则需要在日期上 +1,否则只需要操作小时即可限定数据范围。

关键就在于 0809 的意思。这里 08 是上午八点的意思,为了保持格式一致,在 8 的前面填充了 0。但 Shell 把它当成是八进制(base is 8)。这样一来,怪不得 Shell 认为 08 是不合法的八进制数。为解决这个问题,我们需要告知 Shell 这是个前面填充了 0 的十进制数。于是我们需要改成这样:

1
2
3
if [ $((10#${hour_s} + ${hour_diff})) -gt 23 ]; then
# foo bar
fi
俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。