Shell倒计时脚本,结合图形输出

这个脚本已做了比较大的改动,功能更加完善,脚本可读性更强, 这里附上链接,有需要的朋友可以看看,觉得有什么地方可以改进给我建议,相互学习!
修改后的脚本的博文链接: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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值