一、需求:计算n分钟后的时间,不适合闰年
二、因为本人能力有限,只能写成这样了,哪位大神看到的话请你给我宝贵的意见去优化一下,另外想给脚本加入进度条,虽然能写出进度条的脚本,但是不会怎么加脚本里面,与脚本同步显示,请指教;
三、脚本如下:
#!/bin/bash
#===========================================================================================
#
# PURPOSE:This is a script for calculating time.
#
# FILENAME:time_Practice.sh
#
# USAGE:sh /root/time_Practice.sh
#
# AUTHOR:xxx xxx xxx
#
# Start creating:2019-08-24
#
# Ending time:xxxx-xx-xx
#
#===========================================================================================
function f_print_help
{
echo -e "\033[1;31m"请输入您要计算的时间的时长"\033[0m"
echo -e "\033[1;31m"请输入正确的时间格式"\033[0m"
echo -e "\033[1;31m"时间格式为:"年-月-日"和"时:分:秒"(xxxx-xx-xx xx:xx:xx)"\033[0m"
}
function f_print_judge
{
#输入需要计算的时长不能包含字母,标点符号
if [ -n ${after} ];then
echo ${after} | egrep -q [[:alpha:]]
P1=`echo $?`
echo ${after} | egrep -q [[:punct:]]
P2=`echo $?`
if [ ${P1} -eq 0 -o ${P2} -eq 0 ];then
echo -e "\033[1;31m"您输入的时长为${after}"\033[0m"
echo -e "\033[1;31m"[FAIL] 输入时长 请输入纯数字"\033[0m"
exit 2
else
echo -e "\033[1;32m"[OK] 输入时长 ${after}分钟"\033[0m"
fi
fi
#日期不能含有英文字母,而且格式为xxxx-xxxx-xxxx(纯数字)
if [ -n ${date} ];then
echo ${date} | egrep -q [[:alpha:]]
if [ $? -eq 0 ];then
echo -e "\033[1;31m"您输入的日期为:""${date} ${time}"\033[0m"
echo -e "\033[1;31m"[FAIL] 您输入的日期中含有英文字母"\033[0m"
exit 3
else
echo ${date} | egrep -q [[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}
if [ $? -eq 0 ];then
echo -e "\033[1;32m"[OK] 输入日期 "${date}""\033[0m"
else
echo -e "\033[1;31m"[FAIL] 您输入的日期"${date}"格式不正确,正确的格式为:xxxx-xx-xx"\033[0m"
fi
fi
fi
#时间不能含有英文字母,格式为xx-xx-xx(纯数字)
if [ -n ${time} ];then
echo ${time} | egrep -q [[:alpha:]]
if [ $? -eq 0 ];then
echo -e "\033[1;31m"您输入的日期为:""${date} ${time}"\033[0m"
echo -e "\033[1;31m"[FAIL] 您输入的日期中含有英文字母"\033[0m"
exit 4
else
echo ${time} | egrep -q [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}
if [ $? -eq 0 ];then
echo -e "\033[1;32m"[OK] 输入时间 "${time}""\033[0m"
else
echo -e "\033[1;31m"[FAIL] 您输入的时间"${time}"格式不正确,正确的格式为:xx:xx:xx"\033[0m"
fi
fi
fi
}
function f_print_range
{
#月份没有小于0的也没有大于12月的,下面的同理
if [ ${mouth} -lt 0 -o ${mouth} -gt 12 ];then
echo -e "\033[1;31m"[FAIL] 输入日期 ${mouth} 超出范围"\033[0m"
exit 20
else
echo -e "\033[1;32m"[OK] 输入日期 ${mouth}"\033[0m"
fi
#需要判断现在输入的是几月份,才能控制天数的范围
echo ${mouth} | egrep -q [13578]
D1=`echo $?`
echo ${mouth} | grep -q "10"
D2=`echo $?`
echo ${mouth} | grep -q "12"
D3=`echo $?`
if [ ${D1} -eq 0 -o ${D2} -eq 0 -o ${D3} -eq 0 ];then
if [ ${day} -lt 0 -o ${day} -gt 31 ];then
echo -e "\033[1;31m"[FAIL] 输入日期 ${day} 超出范围"\033[0m"
exit 19
else
echo -e "\033[1;32m"[OK] 输入日期 ${day}"\033[0m"
fi
else
echo ${mouth} | grep -q "2"
if [ $? -eq 0 ];then
if [ ${day} -lt 0 -o ${day} -gt 28 ];then
echo -e "\033[1;31m"[FAIL] 输入日期 ${day} 超出范围"\033[0m"
exit 18
else
echo -e "\033[1;32m"[OK] 输入日期 ${day}"\033[0m"
fi
else
if [ ${day} -lt 0 -o ${day} -gt 30 ];then
echo -e "\033[1;31m"[FAIL] 输入日期 ${day} 超出范围"\033[0m"
exit 17
else
echo -e "\033[1;32m"[OK] 输入日期 ${day}"\033[0m"
fi
fi
fi
if [ ${hour} -lt 0 -o ${hour} -gt 24 ];then
echo -e "\033[1;31m"[FAIL] 输入时间 ${hour} 超出范围"\033[0m"
exit 16
else
echo -e "\033[1;32m[OK] 输入时间 ${hour}\033[0m"
fi
if [ ${minute} -lt 0 -o ${minute} -ge 60 ];then
echo -e "\033[1;31m"[FAIL] 输入时间 ${minute} 超出范围"\033[0m"
exit 15
else
echo -e "\033[1;32m"[OK] 输入时间 ${minute}"\033[0m"
fi
if [ ${second} -lt 0 -o ${second} -ge 60 ];then
echo -e "\033[1;31m"[FAIL] 输入时间 ${second} 超出范围"\033[0m"
exit 14
else
echo -e "\033[1;32m"[OK] 输入时间 ${second}"\033[0m"
fi
}
function f_print_timeloop
{
while :
do
let second++
echo ${second} >> /tmp/second.txt
if [ ${second} -eq 60 ];then
second=0
let minute++
#echo ${minute} >> /tmp/minute.txt
fi
if [ ${minute} -eq 60 ];then
minute=1
let hour++
fi
if [ ${hour} -eq 24 ];then
hour=0
let day++
fi
#月份有小月和大月,还有特殊的2月,天数不一样,这里要区分开来
echo ${mouth} | egrep -q [13578]
H1=`echo $?`
echo ${mouth} | grep -q "10"
H2=`echo $?`
echo ${mouth} | grep -q "12"
H3=`echo $?`
if [ ${H1} == 0 -o ${H2} == 0 -o ${H3} == 0 ];then
if [ ${day} -gt 31 ];then
day=1
let mouth++
fi
else
echo ${mouth} | grep -q "2"
if [ $? -eq 0 ];then
if [ ${day} -gt 28 ];then
day=1
let mouth++
fi
else
if [ ${day} -gt 30 ];then
day=1
let mouth++
fi
fi
fi
if [ ${mouth} -gt 12 ];then
mouth=0
let year++
fi
# T=`cat /tmp/minute.txt 2> /dev/null | wc -l`
#统计/tmp/second.txt文件中含有60的行数,每一行表示一分钟,统计行数之后还要让秒数符合,两个条件同时满足跳出循环,继续运行下面的内容
T=`cat /tmp/second.txt 2> /dev/null | grep "60" | wc -l`
if [ ${T} -eq ${after} -a ${second} -eq ${HS[2]} ];then
break
fi
done
#这里为了保证输出肯定是两位,小于10的输出在前面用0补齐
if [ ${mouth} -lt 10 ];then
mouth=`echo ${mouth} | gawk '{printf "%02d",$1}'`
fi
if [ ${day} -lt 10 ];then
day=`echo ${day} | gawk '{printf "%02d",$1}'`
fi
if [ ${hour} -lt 10 ];then
hour=`echo ${hour} | gawk '{printf "%02d",$1}'`
fi
if [ ${minute} -lt 10 ];then
minute=`echo ${minute} | gawk '{printf "%02d",$1}'`
fi
if [ ${second} -lt 10 ];then
second=`echo ${second} | gawk '{printf "%02d",$1}'`
fi
echo ""
echo -e "\033[1;4;36m"${after}分钟之后的时间为:${year}-${mouth}-${day} ${hour}:${minute}:${second}"\033[0m"
#每一次运行脚本都删除文件,避免影响到下一次脚本的运行
rm -f /tmp/second.txt
}
#############################################################################################################
set -o nounset
##输入参数
read -p "您想要计算多少分钟之后的时间:" after
read -p "请输入日期,格式为:年-月-日(xxxx-xx-xx):" date
read -p "请输入时间,格式为:时:分:秒(xx:xx:xx):" time
if [ -z "${after}" -o -z "${date}" -o -z "${time}" ];then
f_print_help
exit 1
fi
##切割参数
SD=($(echo ${date} | sed 's/-/ /g'))
HS=($(echo ${time} | sed 's/:/ /g'))
##定义变量
year=${SD[0]}
mouth=${SD[1]}
day=${SD[2]}
hour=${HS[0]}
minute=${HS[1]}
second=${HS[2]}
##判断参数
echo -e "\033[1;36m"##检测输入参数格式"\033[0m"
f_print_judge
echo ""
echo -e "\033[1;36m"##检测输入参数范围"\033[0m"
f_print_range
#输入的参数有可能是0开头的,不能参与运算,这里把非0数字提取出来
if [ ${second} -lt 10 ];then
second=`echo ${second} | gawk -F[0] '{print $2}'`
fi
if [ ${minute} -lt 10 ];then
minute=`echo ${minute} | gawk -F[0] '{print $2}'`
fi
if [ ${hour} -lt 10 ];then
hour=`echo ${hour} | gawk -F[0] '{print $2}'`
fi
if [ ${day} -lt 10 ];then
day=`echo ${day} | gawk -F[0] '{print $2}'`
fi
if [ ${mouth} -lt 10 ];then
mouth=`echo ${mouth} | gawk -F[0] '{print $2}'`
fi
##时间循环计算
f_print_timeloop