shell脚本输出连续时间(天/小时/分钟/秒钟),可存入字符串数组中

shell脚本输出连续时间(天/小时/分钟/秒钟),可存入字符串数组中

---------------------------------------------------------------------------

更新

2020年6月9日 11点34分
我在用以下发现写脚本时,发现这种每秒调用系统函数data生成每秒时间的方式存在很大的问题,太耗时,测试如下:
生成1个小时的时间,即3600秒,耗时要7秒多,截图如下:
在这里插入图片描述

改进思路

自己写生成下一秒的程序很多,如下
在这里插入图片描述
难点在哪里呢,其实就是进制,日期中月份和日的进位需要考虑闰年,大小月等问题,写起代码来又if else太复杂,而单纯一天的时间还是十分好写的,毕竟是固定的60进制。

我的想法: 每天的00:00:00到23:59:59都用自己的for循环+if/else生成,只在23:59:59的时候调用系统时间戳转换函数,将“日期+23:59:59”转化为秒数,然后秒数+1,得到新的秒数,然后调用系统时间生成函数,用新的秒数生成时间。这样,每天只需要在变成下一天的时候调用系统时间,极大减少了系统调用的次数。

贴一个大概的代码,这是我在awk命令(c语言风格)里写的一个代码:
注:其中front_time_sec时当前秒数,每次累加,只在天数需要进位的时候才用作系统调用时的参数。
时间格式为:06-0420:36:48
在这里插入图片描述
下面是我用自己上面的思路重新写程序后,测试1小时的耗时:
在这里插入图片描述

---------------------------------------------------------------------------

本shell脚本非完全原创,而是在其他博客的提供的脚本进行修改得到:

原文链接:shell脚本日期遍历(按天&按小时)

版本1 直接输出

脚本编写

文件名:time.sh
功能:起始时间和结束时间,按秒输出连续时间

#!/bin/bash
 
#正序按秒钟遍历时间
 
startdate="20190219200501"
  enddate="20190219200530"
 
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"
 
while [ 1 ] 
do
  if [[ $enddate -lt $startdate ]]; then
  	echo "exit"
    break
  fi
  
  # echo $startdate

  #拼接成YYYY-mm-dd HH:MM:SS的格式,否则使用下个命令中+%s,会无法转换
  startdate=${startdate:0:4}"-"${startdate:4:2}"-"${startdate:6:2}" "${startdate:8:2}":"${startdate:10:2}":"${startdate:12:2}
  
  OutPut=$startdate
  echo $OutPut
  
  #转换成时间戳,+%s为时间格式
  startdate=$(date +%s -d "$startdate")
  #每次执行后,开始日期加一秒钟,则+1 (若加1分钟,则+60;若加1小时,则+1*60*60;依次类推。需注意,不能按1个月加,因为每个月天数不是固定值)
  startdate=$(($startdate+1))
  #时间戳转正常格式时间
  startdate=$(date +%Y%m%d%H%M%S -d "1970-01-01 UTC $startdate seconds")  
done

脚本运行

chmod 777 time.sh
./time.sh

运行效果

在这里插入图片描述

版本2 存入字符串数组中

可以对代码稍作改动

#!/bin/bash
 
#正序按秒钟遍历时间
 
#startdate="20200604193246"
startdate="20200604203640"
  enddate="20200604203720"
 
echo 'startdate: '$startdate
echo 'enddate: '$enddate
echo "-----------------------------------"

index=1
while [ 1 ] 
do
  if [[ $enddate -lt $startdate ]]; then
  	echo "exit"
    break
  fi
  
  #拼接成YYYY-mm-dd HH:MM:SS的格式,否则使用下个命令中+%s,会无法转换
  startdate=${startdate:0:4}"-"${startdate:4:2}"-"${startdate:6:2}" "${startdate:8:2}":"${startdate:10:2}":"${startdate:12:2}
  
  # echo $startdate
  data_varry[$index]=$OutPut
  let index+=1
  
  #转换成时间戳,+%s为时间格式
  startdate=$(date +%s -d "$startdate")
  #每次执行后,开始日期加一秒钟,则+1 (若加1分钟,则+60;若加1小时,则+1*60*60;依次类推。需注意,不能按1个月加,因为每个月天数不是固定值)
  startdate=$(($startdate+1))
  #时间戳转正常格式时间
  startdate=$(date +%Y%m%d%H%M%S -d "1970-01-01 UTC $startdate seconds")  
done

# 输出index
echo $index
# 遍历输出data_varry
for((i=1;i<$index;i++));  
do   
echo ${data_varry[i]}
done

脚本运行

chmod 777 time.sh
./time.sh

运行效果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值