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

猜你喜欢

转载自blog.csdn.net/sodaloveer/article/details/125537691
09
今日推荐