用tput做一个简单的倒计时


以前一直很好奇那种在shell里面出现的动态改变当前行内容的效果,比如你用apt-get install安装包时,shell最下面一行是进度,是不会被冲掉的,内容会动态改变;还有类似wget下载文件时的进度效果等。

最近学习shell,发现这些效果可以通过一个叫做tput的命令来实现,以下就是我在学习tput时做出来的一个简单的倒计时效果。shell脚本如下:

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage $0 count"
  exit 1
fi

echo -n 'Countdown: '
tput sc
for i in `seq $1 | tac`; do
  tput rc
  tput ed
  echo -n $i
  sleep 1
done

echo

第一段是简单的参数检查,要求必须带一个参数,即count,比如10。
从echo -n ‘Countdown: ‘开始倒计时。tput这里有三次命令sc, rc, ed分别是保存当前光标位置,恢复保存的光标位置和清除从当前光标位置到设置行末尾的内容。
你可以想象,当前位置不断显示不同内容的原理是动态改变这个位置上的内容,对于图像来说,记录某个对象的位置,刷新显示时定位笔刷到对象的位置,清除对象所在位置上的内容,最后绘制内容。用tput来说,就是rc -> ed -> “绘制”命令。sc肯定是在最前面只做一次的,因为只要记录一次光标位置就行。

重点讲解完之后,为了显示出效果,用sleep 1按秒计时,否则你什么都看不到,因为太快了。输入上count参数对应$1,但是貌似不能用{1..$1}输出1到$1的序列,所以使用seq做,同时用tac反转顺序。

最后,各位可以运行一下脚本试试看。虽然很简单,但是个人对shell了解更进了一步。

,

2 responses to “用tput做一个简单的倒计时”

    • 应该不是,介于CLI和GUI之前的程序可以用curses/ncurses等库的样子