需求描述

在这里插入代码片平时写一些shell的时候,因为某些原因需要等待(sleep),等待几秒还好,若是需要等待十几秒甚至几十秒,让执行者心里都没有底,到底是是什么原因导致脚本运行卡住了,所以,有一个倒计时显示是十分有利的人机交互体验。

解决思路

最简单的解决方式就是写一个循环,通过加减运算来不停的输出当前值。嗯,就是直接输出会不停的刷屏,比较……不美观,hhh…
在这里插入图片描述

我们最理想的及时方式当然是“数字变换”,而不是“数字刷屏”,因此,我们就需要用一些特殊的方式,让后一个显示的数字直接覆盖前一个数字,实现输出的“原地蹦跶”,emmm…暂且这么形容吧。

如果对shell命令研究较深(或者百度较多)一点的化,不难发现,echo命令本身已经给我们提供了解决方案了,没错,就是万能的echo -e。嗯,就不展开说了,此处我们还是回归正题,如何实现echo的数字“原地蹦跶”。
先介绍两个命令:
1.echo -e "\b"\b 转义后相当于按退格键(backspace) ,但前提是”\b”后面存在字符
啥意思呢?就是说只有在echo -e "\bABC",或者echo -e "AB\bC"的时候,才会起作用,而echo -e "ABC\b"是不起作用的,下面是演示:

[root@py3build ~]# echo -e "\bABC"  ##\b在最前面时,删除\b后面的一个字符,即删除A
BC
[root@py3build ~]# echo -e "AB\bC"  ##\b在中间时,删除\b前面的一个字符,即删除B
AC
[root@py3build ~]# echo -e "ABC\b"  ##\b在最后,不起效果
ABC

2.echo -e "\c"\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n
继续举例:

[root@py3build ~]# echo  "ABC";echo "DEF"
ABC
DEF
[root@py3build ~]# echo -e "ABC\c";echo "DEF"
ABCDEF

效果很明显了吧,不多做解释了,下面进入正题(嗯,第二次声明了),我们需要做的就是用"\b"删除前面echo的输出,并用"\c"来确保不会换行,具体如下:

t=12
while test $t -gt 0
do
    if [ $t -ge 10 ];then 
       echo -e "${t}\b\b\c"
    elif [ $t -eq 9 ];then
       echo -e "  \b\c"
       echo -e "\b${t}\b\c"
    else
       echo -e "${t}\b\c"
    fi
    sleep 1
    t=$((t-1))
done

其中数字9单独拿出来是因为从两位数变为一位数时,从原来的退一格变成退两格了,因此需要特殊处理,同理,如果你要操作三位数的倒计时,也需要在变成两位数的时候单独处理一下

效果展示:

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐