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