shell通过遍历输出两个日期范围内所有日期的方法
前言
在平常c/c++开发中经常遇到日期处理的情形,例如求两个给定的日期之间相差的天数或者需要使用map存储两个固定日期范围内的所有日期。前段时间项目中需要用shell脚本批量处理给定的两个日期范围内所有日期产生的日志,当时以为shell处理不方便就用c++来处理了。后面用shell实现了下,发现也挺简单的。
一、思路流程
1、显然不能直接把这两个日期当作整数相减得到差值然后把初始日期不断累加1得到所有的日期,而且要考虑大小月的问题。
2、为了以后开发的方便,需要把这个求两个固定上期范围内的所有日期功能封装在一个函数(即下面脚本中的genAlldate)中。
但是shell的function不能像C/C++那样能return一个数据类型,也没有引用或者指针的功能,所以在需要先声明一个数组变量DATE_ARRAY用于存放计算出来的所有日期,然后在函数遍历中直接写入每个日期数据。
3、最后使用了3种方法来遍历输出数组DATE_ARRAY存放的所有日期。
4、输出的日期格式尽量能够自定义,例如2017-03-30、2017.06.18和20170618等等。
二、shell程序
#!/bin/bash # FileName: alldateduringtwodays1.sh # Description: Print all the date during the two days you inpute. # Simple Usage: ./alldateduringtwodays1.sh 2017-04-01 2017-06-14 or ./alldateduringtwodays1.sh 20170401 20170614 [-] # (c) 2017.6.15 vfhky https://typecodes.com/linux/alldateduringtwodays1.html # https://github.com/vfhky/shell-tools/blob/master/datehandle/alldateduringtwodays1.sh if [[ $# -le 2 || $# -gt 3 ]]; then echo "Usage: $0 2017-04-01 2017-06-14 [-] or $0 20170401 20170614 [-] ." exit 1 fi START_DAY=$(date -d "$1" +%s) END_DAY=$(date -d "$2" +%s) # The spliter bettwen year, month and day. SPLITER=${3} # Declare an array to store all the date during the two days you inpute. declare -a DATE_ARRAY function genAlldate { if [[ $# -ne 3 ]]; then echo "Usage: genAlldate 2017-04-01 2017-06-14 [-] or genAlldate 20170401 20170614 [-] ." exit 1 fi START_DAY_TMP=${1} END_DAY_TMP=${2} SPLITER_TMP=${3} I_DATE_ARRAY_INDX=0 # while [[ "${START_DAY}" -le "${END_DAY}" ]]; do while (( "${START_DAY_TMP}" <= "${END_DAY_TMP}" )); do cur_day=$(date -d @${START_DAY_TMP} +"%Y${SPLITER_TMP}%m${SPLITER_TMP}%d") DATE_ARRAY[${I_DATE_ARRAY_INDX}]=${cur_day} # We should use START_DAY_TMP other ${START_DAY_TMP} here. START_DAY_TMP=$((${START_DAY_TMP}+86400)) ((I_DATE_ARRAY_INDX++)) #sleep 1 done } # Call the funciotn to generate date during the two days you inpute. genAlldate "${START_DAY}" "${END_DAY}" "${SPLITER}" # [Method 1] Traverse the array. echo -e "[Method 1] Traverse the array." for SINGLE_DAY in ${DATE_ARRAY[@]}; do echo ${SINGLE_DAY} done # [Method 2] Traverse the array. echo -e "\n[Method 2] Traverse the array." for i in "${!DATE_ARRAY[@]}"; do printf "%s\t%s\n" "$i" "${DATE_ARRAY[$i]}" done # [Method 3] Traverse the array. echo -e "\n[Method 3] Traverse the array." i=0 while [ $i -lt ${#DATE_ARRAY[@]} ] do echo ${DATE_ARRAY[$i]} let i++ done # If you do not need this array any more, you can unset it. # unset DATE_ARRAY exit 0
三、测试
该shell脚本支持的输入日期格式为2017-04-01和20170401这两种,输出的日期格式格式很灵活,只要在执行程序时再追加一个任意日期分隔符(例如常见的.、-等)即可,最后由脚本中的SPLITER变量做输出格式控制。
这里使用./alldateduringtwodays1.sh 2017-03-30 2017-04-02 .进行测试,效果如下图所示。
四、脚本管理
目前已经把这个脚本放在Github了,地址是https://github.com/vfhky/shell-tools(也可以通过本地下载),以后脚本的更新或者更多好用的脚本也都会加入到这个工程中。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 初识centos7与centos6的区别整理(内核、命令等)
- Apache下通过shell脚本提交网站404死链的方法
- centos查找已安装的jdk路径的方法
- CentOS7+apache+php7+mysql5.7配置教程详解
- 如何利用SystemTap统计函数执行耗时详解
- 关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程
- 基于代码的自动化和无代码自动化
- Java Stream中map和flatMap方法
- 关于Apache shiro实现一个账户同一时刻只有一个人登录(shiro 单点登录)
- 视频上云安防视频云服务平台EasyCVR通过海康sdk协议接入多路设备拉流时出现部分设备拉流不稳定是什么原因?
- Centos6.x服务器配置jdk+tomcat+mysql环境(jsp+mysql)
- Linux的压缩和解压缩的方法总结
- RTSP/GB28181/HIKSDK/Ehome协议视频融合平台EasyCVR编译C++报参见“XXX”的声明错误
- 详解 Linux 常用目录的作用
- CentOS6环境下搭建路由器的方法