shell脚本报错: 09: value too great for base (error token is “09“)

项目场景:

因项目需求,需要取某个小时的数字,一般都00、01、02…这样子的格式的数字。


报错提示:

test.sh: line 10: [[: 09: value too great for base (error token is "09")


原因分析:

这种异常主要是由于shell中以0开关的,例如09会默认被识别为八进制数字,如果使用八进制数字与十进制进行比较或运算就会显示如上报错提示。

运行以下这段代码就会显示如上报错提示

#bin/env bash
#输出文件
time_tag=$(date +"%Y%m%d%H")
start_hour=09
end_hour=$(expr substr "$time_tag" 9 2)

echo $time_tag,$start_hour,$end_hour

if [[ "$end_hour" -ge "09" && "$end_hour" -le "19" ]];then
echo "你好"
else
echo "不在时间段内"
fi

解决方案:

让Shell强制将"09"当成10进制来解释
$(($((10#$start_hour))))的作用就是将八进制改成十进制

[se@b1i9 ~]$ start_hour=09
[se@b1i9 ~]$ echo $((10#$start_hour))
9

修改后,正常运行的脚本

#bin/env bash
#输出文件
time_tag=$(date +"%Y%m%d%H")
start_hour=09
end_hour=$(expr substr "$time_tag" 9 2)

echo $time_tag,$start_hour,$end_hour

if [[ "$((10#$end_hour))" -ge "$((10#$start_hour))" && "$((10#$end_hour))" -le "19" ]];then
echo "你好"
else
echo "不在时间段内"
fi

运行脚本后结果

[se@b1i9 ~]$ sh test.sh
2022063016,09,16
你好

其他需要注意:

如果参与运算的数值是以’0’开头且达到了两位数或更多,并且数值的每一位均在0-7之间,则 Shell 不会报错,但会输出错误的运算结果。
举例如下

[se@b1i9 ~]$ time=`date +%S`
[se@b1i9 ~]$ time2=$((time%15))
[se@b1i9 ~]$ echo $time2
3

[se@b1i9 ~]$ num=013
[se@b1i9 ~]$ echo $(($num+1))
12
[se@b1i9 ~]$ echo $(($num-1))
10

后面有数字不在1-7范围内就会出现上述类似的错误

[se@b1i9 ~]$ num=08
[se@b1i9 ~]$ echo $(($num+1))
-bash: 08: value too great for base (error token is "08")

如果以0开头,带1-7一个数字进行加减运算,数值并不会出错,最好还是转为十进制进行运算

[se@b1i9 ~]$ num=07
[se@b1i9 ~]$ echo $(($num+1))
8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值