shell脚本实战——简单的计算时间的脚本

一、需求:计算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   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章