报错提示:
bakstatus.sh: line 38: [[: 2020-04-09: value too great for base (error token is “09”)
脚本:
#打印年月日
DATE=$(date +%Y-%m-%d)
2020-04-09
原因:
if [[ $Y -eq $DATE ]]
then
echo -e "\033[36m 小爱提示:$(sed -n "${Z}p" /home/soft/bakstatus/ip.txt)备份正常哟!\033[0m"
else
echo -e "\033[41m 警告:$(sed -n "${Z}p" /home/soft/bakstatus/ip.txt)备份文件有问题!\033[0m"
fi
let Z++
done
因为判断数据文件是否是当天的备份,【2020-04-09 == 2020-04-09】,因为shell中的双括号运算符会将0开头的数字当做8进制来计算,所以会报错,09比基数大。
个人解决方法:
#使用过滤的方法,打印想输出的值,进行传参,判断。
[root@test /home/soft/bakstatus]# date +%Y%m%d
20200409
[root@test /home/soft/bakstatus]# cat /home/soft/bakstatus/bak.txt | awk -F_ ‘{print $2}’ | sed ‘s/-//g’
20200409
20200409
20200409
20200409
20200409
for Y in $(cat /home/soft/bakstatus/bak.txt | awk -F_ '{print $2}' | sed 's/-//g')
do
if [[ $Y -eq $DATE ]]
then
echo -e "\033[36m 小爱提示:$(sed -n "${Z}p" /home/soft/bakstatus/ip.txt)备份正常哟!\033[0m"
else
echo -e "\033[41m 警告:$(sed -n "${Z}p" /home/soft/bakstatus/ip.txt)备份文件有问题!\033[0m"
fi
let Z++
done
网络解决方法:
day =$(date +%d)
ret=$(($day %3))
if [ $ret -ne 0 ];then
echo "we don\'t restart $spellcmd"
exit 0
fi
但是脚本运行一段时间后, 发现程序有些异常,每月9号没有更新数据,也没有重启进程,其它时间点都是工作正常的,难道在shell脚本中 9%3 不等于0吗?看了脚本的运行日记 , 创造这个过错 : -bash: 09: value too great for base (error token is “09”); 在网上搜了一下, date +%d发生 的小时是类似01 02 … 10 … 23的样子, 默认情况下, 不足2位的前面补零, 而$(())在做数学运算的时间 , 把0开头的数字认为 是8进制的, 以是 $((09)), 就报了”value too great for base“的错误。
再查了一下date的手册, 发现:
-
(hyphen) do not pad the field
0 (zero) pad with zeros (这是缺省行为)
因此,将脚本day = ( d a t e + (date +%d) 修改为day = (date+(date +%-d),就可以产生类似于 0 1 2 3…12的输出,而不是位数不足前面补0的输出。
PS:希望对您有所帮助!!