/【雷火UX数据挖掘】运用shell遍历时间执行脚本

【雷火UX数据挖掘】运用shell遍历时间执行脚本



在实际的工作中,我们经常需要计算每天、每小时的数据。一般这种情况可以使用python、R等软件,运用while、for等循环语句实现。但如果进行数据插入或涉及多种软件语言操作的情况,则最好要学会如何遍历输出时间,并使用输出的时间来执行脚本。

1

 正序遍历日期  

首先,在shell中正序遍历日期可直接执行如下脚本:
#!/bin/bashstart_date="$1"end_date="$2"
echo "-----------------------------------"echo 'start_date: '$start_dateecho 'end_date: '$end_dateecho "-----------------------------------"
while [ "$(date -d "$start_date -1 days" "+%Y-%m-%d")" != "$end_date" ];do echo $start_date 'start' bash insert_data.sh $start_date echo $start_date 'success' start_date=`date -d "$start_date +1 days" "+%Y-%m-%d"`done

接下来,将对脚本中的各步骤进行介绍。

传参过程

start_date="$1"end_date="$2"
第一个参数传为start_date,而第二个参数传为end_date,将上述脚本命名为xx.sh,则可执行
bash xx.sh 2021-10-10 2021-10-23

即可将2021-10-10传为start_date,2021-10-23传为end_date。

传参结果展示



echo "-----------------------------------"echo 'start_date: '$start_dateecho 'end_date: '$end_dateecho "-----------------------------------"

即利用echo输出参数。如传参成功,则会如下方截图所示,否则冒号后无数据。


循环输出日期并执行脚本



while [ "$(date -d "$start_date -1 days" "+%Y-%m-%d")" != "$end_date" ];do   echo $start_date 'start'  bash insert_data.sh $start_date  echo $start_date 'success'  start_date=`date -d "$start_date +1 days" "+%Y-%m-%d"`done
对于循环输出日期的阶段,while循环也可替换成for循加if-break语句,“-1 days”可替换成“1 days ago”。(而类似的“+1 days”可替换成“-1 days ago”)
while [ "$(date -d "$start_date 1 days ago" "+%Y-%m-%d")" != "$end_date" ];
如日期中是没有“-”的类型,也可用数字直接比较大小来定义循环的条件,即:
while [[ $start_date -le $end_date ]];

其中-le指小于等于,而类似地,-ge指大于等于,-gt指大于,-lt指小于,-eq指等于,-ne指不等于。



对于执行脚本的阶段:

  echo $start_date 'start'  bash insert_data.sh $start_date  echo $start_date 'success'  start_date=`date -d "$start_date +1 days" "+%Y-%m-%d"`

echo可以表明哪个日期准备执行脚本及已成功执行脚本,bash则可替换成任何需要执行的脚本语句,之后则可日期后延一天,重新执行脚本。如成功,则除脚本执行部分,会输出如下提示:

2

变体一:倒叙遍历日期

循环部分可替换如下:

while [ "$(date -d "$start_date -1 days" "+%Y-%m-%d")" != "$end_date" ];do   echo $end_date 'start'  bash insert_data.sh $end_date  echo $end_date 'success'  end_date=`date -d "$end_date -1 days" "+%Y-%m-%d"`done
3

变体二:正序遍历小时

循环部分可替换如下:

while [ "$start_date" != "$end_date" ];do   echo $start_date 'start'  bash insert_data.sh $start_date  echo $start_date 'success'  start_date=$(date +%s -d "$start_date")  start_date=$(($start_date+1*60*60))  start_date=`date "+%Y-%m-%d %H:%M:%S" -d "1970-01-01 UTC $start_date seconds"`done
echo $end_date 'start'bash insert_data.sh $end_dateecho $end_date 'success'

由于shell中没有小时加减的函数,因此目前采用“转化为时间戳->时间戳加减->转化为标准时间”的方式完成遍历小时的操作。



另外,遍历分钟、秒钟的情况也是类似。


最后欢迎大家投递雷火UX设计面向2022届毕业生的校招岗位

雷火UX商务沟通:grp.leihuoux@corp.netease.com
往期推荐


本文来自微信公众号“网易雷火UX用户体验中心”(ID:LeihuoUX)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。