Shell字符串使用十进制转换

其实不知道该起什么题目。

先说下需求,线上的log是按照五分钟为粒度切分的,即每五分钟产生一个文件,19:04的log写入到

1900结尾的log文件中,19:05写入到1905结尾的log文件中。

在实时分析log的时候,往往需要我们将log的后缀拼接出来,如下是我实现的函数

function GenLogSuffixFromUnixTime() 
{
  local unix_time=$1
  local minute=`date -d @$unix_time +%M`
  minute=$(((10 + minute)%10))
  if [[ $minute -ge 5 ]]; then
    minute=$((minute - 5))
  fi
  unix_time=$(($unix_time - $minute*60))
  local time_str=`date -d @$unix_time +%Y%m%d.%H%M`
  echo $time_str
}

想法很简单

1. 传入一个unixtime,可以为当前的时间,也可以是当前时间的偏移,如一天、五分钟等。

2. 将unixtime转换为minute,将minute转换到0或5的文件上。

3. 新的unixtime时间转换为时间字符串。

在minute=08 09时,会出错,让人不明所以。

后来在同事的提醒下(之前也遇到过类似的情形),是由于Shell解析的时候将01~07当成八进制的数了,

当出现08 09在八进制下不合法的表示时,自然出错了。

知道原因了,解决方案是将高亮的代码语句替换为如下

minute=$(((10 + 10#$minute)%10))

minute前面的10表示作为十进制数。

希望写出来对大家有用

posted @ 2014-01-23 22:19  westfly  阅读(2659)  评论(1编辑  收藏  举报