今天网站出现了一个bug,判定是网站缓存清理出现了问题。排查之后,定位到了清理缓存的脚本上。

脚本可以简化如下:

1
2
3
4
5
HOUR=`date +%H`
STEP=21

START=$(($HOUR*$STEP))
END=$((($HOUR+1)*$STEP))

脚本的第一行赋值有问题,date命令的手册:

1
%H     hour (00..23)

使用%H参数得到的小时数是两位的,所以当前是0点到9点的时候,得到的是00–09。由于前缀0的原因,bash会把该值当作八进制来处理。
问题来了,当时间在7点到九点的时候,脚本的执行就会发生错误:

  • 7点时,HOUR的值为07,运行到第五行(($HOUR+1))的时候得到08。八进制表示的数竟然出现了8,肯定会出错。
  • 8点和9点时,在脚本第一行赋值的时候就会出错。

这个问题由两种解决方案:

  • 第一种:将脚本的第一行改为
    1
    HOUR=10#`date +%H`,

加上10#是告诉bash,把数值当作10进制数来处理。

  • 第二种:将脚本的第一行改为
    1
    HOUR=`date +%k`

因为%k参数得到的小时数是(0..23),没有前缀0,所以就不存在进制的问题了。