这个脚本已做了比较大的改动,功能更加完善,脚本可读性更强, 这里附上链接,有需要的朋友可以看看,觉得有什么地方可以改进给我建议,相互学习!
修改后的脚本的博文链接:https://blog.csdn.net/weixin_44901564/article/details/101781896
一、脚本需求
1.能够满足1000分钟以内的倒计时
2.输入秒数超过60时能够自动转化为分钟输出
3.要在屏幕中间结合图形输出
4.输出的图形数字每一个图形都是由该数字组成
先看看输出效果的图片:
像这样,每一个数字的图形都是由该数字组成
二、写脚本的思路
这个脚本可以看成是两种脚本的结合:
1.倒计时脚本
2.输出图形的脚本,而且输出的数字图形都是由该数字组成
可以说是将倒计时脚本输出的值存在一个变量里面传给输出输出图形脚本,然后将变量的值分解开来,例如变量的值为12:12,可以将12:12拆分为5个部分,分别为1、2、:、1、 2,然后再利用if判断判断每一个数字的值是多少,然后再输出相对应的数字图形
图形的坐标都由上图所得:
例如:
数字0的图形,坐标为(0 0 1 0 2 0 0 1 2 1 0 2 2 2 0 3 2 3 0 4 1 4 2 4)
数字1的图形,坐标为(1 0 1 1 1 2 1 3 1 4)
三、上脚本
#!/bin/bash
#====================================================================
#
# 文件名:countdown_Graphical.sh
#
# 用途:倒计时
#
# 用法:sh /root/countdown_Graphical.sh--->不输入时间默认为0
#
# 创建时间:2019-09-20
#
# 作者:xxx
#
# 坐标如下: 00 10 20
# 01 11 21
# 02 12 22
# 03 13 23
# 04 14 24
#
#===================================================================
echo -e "\033[1;32m"+===================================================================="\033[0m"
echo -e "\033[1;32m"+"\033[0m" "\033[1;31m"注意:"\033[0m"
echo -e "\033[1;32m"+"\033[0m" "\033[1;31m"脚本只支持数字倒计时,如果不小心输入'\'符号看到脚本卡住,继续按回车键"\033[0m"
echo -e "\033[1;32m"+"\033[0m" "\033[1;31m"或者正常输入就可以了,因为linux命令行下执行'\'的作用是换行输入"\033[0m"
echo -e "\033[1;32m"+===================================================================="\033[0m\n"
function f_print_coordinate
{
num0=(0 0 1 0 2 0 0 1 2 1 0 2 2 2 0 3 2 3 0 4 1 4 2 4)
num1=(1 0 1 1 1 2 1 3 1 4)
num2=(0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 3 0 4 1 4 2 4)
num3=(0 0 1 0 2 0 2 1 2 2 1 2 0 2 2 3 2 4 1 4 0 4)
num4=(0 0 0 1 0 2 1 2 2 2 2 0 2 1 2 3 2 4)
num5=(2 0 1 0 0 0 0 1 0 2 1 2 2 2 2 3 2 4 1 4 0 4)
num6=(2 0 1 0 0 0 0 1 0 2 0 3 0 4 1 2 2 2 2 3 2 4 1 4)
num7=(0 0 1 0 2 0 2 1 2 2 2 3 2 4)
num8=(0 0 0 1 0 2 0 3 0 4 1 0 2 0 2 1 1 2 2 2 2 3 1 4 2 4)
num9=(0 0 0 1 0 2 1 0 2 0 2 1 2 2 1 2 2 3 2 4 1 4 0 4)
colon=(1 1 1 3 )
}
function f_print_judge
{
echo ""
echo -e "\033[1;31m[ FAIL ]\033[0m \033[1;31m$1\033[0m \n"
}
##确定k的值
function f_if_k
{
k1=($1)
if [ "${z[*]}" == "${k1[*]}" ];then
k=$2
k=${k}${k}
fi
}
function f_judge_k
{
f_if_k "${num0[*]}" 0
f_if_k "${num1[*]}" 1
f_if_k "${num2[*]}" 2
f_if_k "${num3[*]}" 3
f_if_k "${num4[*]}" 4
f_if_k "${num5[*]}" 5
f_if_k "${num6[*]}" 6
f_if_k "${num7[*]}" 7
f_if_k "${num8[*]}" 8
f_if_k "${num9[*]}" 9
}
##输出图形的函数
function f_print_num1
{
z=($1)
f_judge_k
##显示颜色
echo -e "\033[1;31m"
for((i = 0,j = 1;i < ${#z[@]};i=i+2,j=j+2))
do
((x = left+2*${z[i]}))
((y = top+${z[j]}))
echo -e "\033[${y};${x}H${k}"
done
##恢复颜色
echo -e "\033[0m"
echo ""
}
function f_print_num2
{
z=($1)
f_judge_k
##显示颜色
echo -e "\033[1;32m"
for((i = 0,j = 1;i < ${#z[@]};i=i+2,j=j+2))
do
((x = left+2*${z[i]}))
((y = top+${z[j]}))
echo -e "\033[${y};${x}H${k}"
done
##恢复颜色
echo -e "\033[0m"
echo ""
}
##判断输出时间的数字的函数
function f_judge_min0
{
h0=($1)
if [ "${min0}" == "$2" ];then
left=93
top=28
f_print_num1 "${h0[*]}"
fi
}
function f_judge_min1
{
h1=($1)
if [ "${min1}" == "$2" ];then
left=100
top=28
f_print_num1 "${h1[*]}"
fi
}
function f_judge_min2
{
h2=($1)
if [ "${min2}" == "$2" ];then
left=107
top=28
f_print_num1 "${h2[*]}"
fi
}
function f_colon
{
left=114
top=28
h3=($1)
##显示颜色
echo -e "\033[1;35m"
for((i = 0,j = 1;i < ${#h3[@]};i=i+2,j=j+2))
do
((x = left+2*${h3[i]}))
((y = top+${h3[j]}))
echo -e "\033[${y};${x}H**"
done
##恢复颜色
echo -e "\033[0m"
echo ""
}
function f_judge_sec1
{
h4=($1)
if [ "${sec1}" == "$2" ];then
left=120
top=28
f_print_num2 "${h4[*]}"
fi
}
function f_judge_sec2
{
h5=($1)
if [ "${sec2}" == "$2" ];then
left=127
top=28
f_print_num2 "${h5[*]}"
fi
}
##判断时间并且输出图形的函数
function f_judge_time
{
echo ${time} | gawk -F: '{print $1}' | grep -oqE [[:digit:]]{3}
if [ $? -eq 0 ];then
##切割时间
total=($(echo ${time} | sed -r 's/(.)(.)(.)(.)(.)(.)/\1 \2 \3 \4 \5 \6/'))
min0=${total[0]}
min1=${total[1]}
min2=${total[2]}
col=${total[3]}
sec1=${total[4]}
sec2=${total[5]}
##判断min0
f_judge_min0 "${num0[*]}" 0
f_judge_min0 "${num1[*]}" 1
f_judge_min0 "${num2[*]}" 2
f_judge_min0 "${num3[*]}" 3
f_judge_min0 "${num4[*]}" 4
f_judge_min0 "${num5[*]}" 5
f_judge_min0 "${num6[*]}" 6
f_judge_min0 "${num7[*]}" 7
f_judge_min0 "${num8[*]}" 8
f_judge_min0 "${num9[*]}" 9
else
##切割时间
total=($(echo ${time} | sed -r 's/(.)(.)(.)(.)(.)/\1 \2 \3 \4 \5/'))
min1=${total[0]}
min2=${total[1]}
col=${total[2]}
sec1=${total[3]}
sec2=${total[4]}
fi
##判断min1
f_judge_min1 "${num0[*]}" 0
f_judge_min1 "${num1[*]}" 1
f_judge_min1 "${num2[*]}" 2
f_judge_min1 "${num3[*]}" 3
f_judge_min1 "${num4[*]}" 4
f_judge_min1 "${num5[*]}" 5
f_judge_min1 "${num6[*]}" 6
f_judge_min1 "${num7[*]}" 7
f_judge_min1 "${num8[*]}" 8
f_judge_min1 "${num9[*]}" 9
##判断min2
f_judge_min2 "${num0[*]}" 0
f_judge_min2 "${num1[*]}" 1
f_judge_min2 "${num2[*]}" 2
f_judge_min2 "${num3[*]}" 3
f_judge_min2 "${num4[*]}" 4
f_judge_min2 "${num5[*]}" 5
f_judge_min2 "${num6[*]}" 6
f_judge_min2 "${num7[*]}" 7
f_judge_min2 "${num8[*]}" 8
f_judge_min2 "${num9[*]}" 9
##输出冒号
f_colon "${colon[*]}"
##判断sec1
f_judge_sec1 "${num0[*]}" 0
f_judge_sec1 "${num1[*]}" 1
f_judge_sec1 "${num2[*]}" 2
f_judge_sec1 "${num3[*]}" 3
f_judge_sec1 "${num4[*]}" 4
f_judge_sec1 "${num5[*]}" 5
f_judge_sec1 "${num6[*]}" 6
f_judge_sec1 "${num7[*]}" 7
f_judge_sec1 "${num8[*]}" 8
f_judge_sec1 "${num9[*]}" 9
##判断sec2
f_judge_sec2 "${num0[*]}" 0
f_judge_sec2 "${num1[*]}" 1
f_judge_sec2 "${num2[*]}" 2
f_judge_sec2 "${num3[*]}" 3
f_judge_sec2 "${num4[*]}" 4
f_judge_sec2 "${num5[*]}" 5
f_judge_sec2 "${num6[*]}" 6
f_judge_sec2 "${num7[*]}" 7
f_judge_sec2 "${num8[*]}" 8
f_judge_sec2 "${num9[*]}" 9
}
##最后倒计时完毕输出00:00
function f_end
{
left=100
top=28
f_print_num1 "${num0[*]}"
left=107
top=28
f_print_num1 "${num0[*]}"
f_colon "${colon[*]}"
left=120
top=28
f_print_num2 "${num0[*]}"
left=127
top=28
f_print_num2 "${num0[*]}"
}
######################################################################################
read -p "输入倒计时时间(分钟):" minute
read -p "输入倒计时时间(秒钟):" second
##定义默认值
minute=${minute:-0}
second=${second:-0}
##判断参数
echo "${minute}" "${second}" | grep -qE [[:alpha:]]
st1=$?
echo "${minute}" "${second}" | grep -qE [[:punct:]]
st2=$?
if [ "${st1}" == 0 ];then
f_print_judge "不能输入英文"
exit 1
elif [ "${st2}" == 0 ];then
f_print_judge "不能输入标点符号"
exit 2
fi
if [ "${minute}" -gt 999 ];then
f_print_judge "最高支持999分钟!!!"
exit 3
fi
if [ "${minute}" -gt 900 ];then
if [ "${second}" -gt 60 ];then
f_print_judge "当分钟数大于900分钟时,输入的秒数不能超过60!!!"
exit 4
fi
fi
if [ "${minute}" -le 900 ];then
if [ "${second}" -gt 5940 ];then
f_print_judge "当分钟小于或者等于900时,输入的秒数不能超过5940!!!"
exit 5
fi
fi
##计算总秒数
second=$[${minute}*60+${second}]
##调用坐标图
f_print_coordinate
##倒计时循环
while [ ${second} -gt 0 ]
do
min=$[${second}/60]
sec=$[${second}%60]
if [ ${min} -lt 10 ];then
clear
min=$(printf %02d ${min})
time="${min}:${sec}"
if [ ${sec} -lt 10 ];then
clear
time="${min}:0${sec}"
fi
else
clear
time="${min}:${sec}"
if [ ${sec} -lt 10 ];then
clear
time="${min}:0${sec}"
fi
fi
f_judge_time
sleep 1
let second-=1
done
clear
f_end
echo ""
脚本已做了比较大的改动,功能更加完善,脚本可读性更强, 在本人后面的博文中,这里附上链接,有需要的朋友可以看看,觉得有什么地方可以改进给我建议,相互学习!
修改后的脚本的博文链接:https://blog.csdn.net/weixin_44901564/article/details/101781896