shell按日期的循环

        经常有需要按日期运行脚本补数据。有时候是好几天的。但是可能整个过程下来会超过24个小时。

最早的时候是这样的一个方案。

for((i=0;i<10;i++));
do
       date=`date -d  "$i days ago" +"%Y%m%d"`
       sh dojob.sh $date
done

        这个方案的不足就是,跨天之后,会漏掉某个日期。后来诞生了一个用配置文件的方法。把要搞的日期写到一个文本里。每行写一个日期。

file=/data/datelist.txt

while read day
do
      sh dojob.sh ${day}

done < $file

         这个方案就是利用了类似配置文件的方法。对于离散的日期,可以这样的方式来实现。

        对于方案1,还有一种修改的方案。就是利用数组的方式。

for day in {20160801..20160811}
do
      sh dojob.sh $day
done

           不足之处就是没办法跨月。所以还可以利用时间戳来处理。

startDate='20160621'
endDate='20180620'

for((ts=`date -d "${startDate}" +"%s"`;ts<=`date -d "${endDate}" +"%s"`;ts+=86400 ));
do
     day=`date  -d @${ts} +"%Y%m%d"`
     sh dojob.sh $day
done

          上例的再次改良版本(时间跨度可以支持年,月,日):

startDate=20171201
endDate=20171205
while [[ $startDate -le $endDate ]];
do
   echo $startDate
   startDate=`date -d "$startDate 1 days" +"%Y%m%d"`
done

猜你喜欢

转载自aeolus1983.iteye.com/blog/2318839