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 typecodes/linux/alldateduringtwodays1.html
# github/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.
shell最简单脚本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 .进⾏测试,效果如下图所⽰。
四、脚本管理
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论