shell脚本倒计时
需求描述在这里插入代码片平时写一些shell的时候,因为某些原因需要等待(sleep),等待几秒还好,若是需要等待十几秒甚至几十秒,让执行者心里都没有底,到底是是什么原因导致脚本运行卡住了,所以,有一个倒计时显示是十分有利的人机交互体验。解决思路最简单的解决方式就是写一个循环,通过加减运算来不停的输出当前值。嗯,就是直接输出会不停的刷屏,比较……不美观,hhh…我们最理想的及时方式当然是“数字变换
需求描述
在这里插入代码片平时写一些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单独拿出来是因为从两位数变为一位数时,从原来的退一格变成退两格了,因此需要特殊处理,同理,如果你要操作三位数的倒计时,也需要在变成两位数的时候单独处理一下
效果展示:
更多推荐
所有评论(0)