linux循环⼩时,shell脚本⽇期遍历(按天按⼩时)使⽤shell脚本遍历⽇期
1. 按天倒序遍历⽇期 ( 正序修改⼀下⽇期增减函数即可 )
#!/bin/bash
#倒序按天遍历⽇期
#传⼊遍历的开始时间和结束时间
startdate="$1"
enddate="$2"
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"
#序列1-300,表⽰遍历300次,因为有结束时间的限制,所以实际上不会循环300次
for i in `seq 1 300`; do
#当开始时间⼩于结束时间时,直接结束脚本
if [[ $startdate -lt $enddate ]]; then
break
fi
echo $startdate
#执⾏hiveSQL脚本,我是需要按⽇期执⾏hiveSQL,这⾥可以⽆视
hive -hiveconf input_date=$startdate -f mergeSmallFiles.sql # >>
#每次执⾏后,使开始⽇期减⼀天,如果要正序,将下⾯-1换成+1即可,当然开始时间和结束时间也要换⼀下
startdate=$(date -d "$startdate -1 day" +%Y%m%d)
done
运⾏结果如下:
2. 按⼩时倒序遍历⽇期 ( 正序修改⼀下⽇期增减函数即可 )
因为shell中没有⼩时加减的函数,所以这⾥要做⼏个步骤:
#!/bin/bash
#倒序按⼩时遍历时间
startdate="$1"
enddate="$2"
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"
for i in `seq 1 300`; do
if [[ $startdate -lt $enddate ]]; then
break
fi
echo $startdate
#拼接成YYYYmmdd HH的格式,否则使⽤下个命令中+%s,会⽆法转换
startdate=${startdate:0:4}"-"${startdate:4:2}"-"${startdate:6:2}" "${startdate:8:2}
#转换成时间戳,+%s为时间格式
startdate=$(date +%s -d "$startdate")
#每次执⾏后,开始⽇期减⼀个⼩时
startdate=$(($startdate-1*60*60))
#时间戳转正常格式时间
startdate=$(date +%Y%m%d%H -d "1970-01-01 UTC $startdate seconds")
#执⾏hiveSQL脚本,可以⽆视掉
hive -hiveconf input_date=$startdate -f mergeSmallFiles.sql # >> done
运⾏结果如下:linux循环执行命令脚本