一、需求:計算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