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