chaper05/countdown.sh
#!/bin/bash
#功能描述(Description):时间倒计时.

#使用Ctrl+C中断脚本或者倒计时结束时显示光标.
trap 'tput cnorm;exit' INT EXIT

#定义数组变量,该数组有9行9个元素,每行是1个元素,每一个数字宽度占用12列.
#循环对数组9个元素进行字串截取,每一个元素提取0-11位就是数字0,
#循环对数组9个元素进行字串截取,每一个元素提取12-23位就是数字1,依此类推.
number=(
'  0000000000      111     2222222222  3333333333 44    44     5555555555  6666666666   777777777   888888888  9999999999 '
'  00      00    11111             22          33 44    44     55          66           77     77   88     88  99      99 '
'  00      00   111111             22          33 44    44     55          66           77     77   88     88  99      99 '
'  00      00       11             22          33 44    44     55          66                  77   88     88  99      99 '
'  00      00       11     2222222222  3333333333 44444444444  5555555555  6666666666          77   888888888  9999999999 '
'  00      00       11     22                  33       44             55  66      66          77   88     88          99 '
'  00      00       11     22                  33       44             55  66      66          77   88     88          99 '
'  00      00       11     22                  33       44             55  66      66          77   88     88          99 '
'  0000000000  1111111111  2222222222  3333333333       44     5555555555  6666666666          77   888888888  9999999999 '
)

#通过位置变量获取需要倒计时的时间,并将分钟转换为秒.
translate_time(){
   if [ -z "$1" ];then
       echo "$0 需要时间参数n"
       echo "n:表示需要倒计时的时间,单位为分钟."
       exit
   fi
   sec=$[$1*60]    #将分钟转换为秒.
}

#定义函数:打印数组中的某一个数字.
print_time(){
    #从第几个位置开始提取数组元素,数字0就从0开始,数字1就从12开始,数字2就从24开始,依此类推.
    begin=$[$1*12]
    for i in `seq 0 ${#number[@]}`   #0-9的循环.
    do
        tput cup $[i+5] $2
        echo -en "\033[91m${number[i]:$begin:12}\033[0m"
    done
}

#每秒刷新屏幕,打印新的时间,每循环一次倒计时秒数减1.
translate_time $1
while :
do
    [ $sec -lt 0 ] && exit
    tput civis    #隐藏光标.
    tput clear
    tput cup 3 16
    echo  -e "\e[1;32m$1分钟倒计时:\e[0m"
    #循环将倒计时秒数中的所有数字提取出来,显示在屏幕.
    for j in `seq ${#sec}`
    do
        num=`echo $sec | cut -c $j`
        y=$[j*16]
        print_time $num $y
    done
    let sec--
    echo
    sleep 1
done

