Shell中的进度指示器

       相信大家做shell脚本时,经常遇到耗费时间的问题,这时如果有一个进度指示器岂不更好,这在其他语言中很容易就实现了,在shell里也不难,看下边的几种方法:

       (1)使用一系列圆点来指示进度:利用每隔几秒就打印一个点来指示,看源码:

#! /bin/ksh
while(true)
do
        echo -n "."
        sleep 1
done

       这里每隔1秒打印一个点表示进度情况。其实更多情况下,我们会把这个进度指示操作放在后台运行,前台做更重要的工作,当前台工作做完后,然后杀死这个后台指示进程的部分,如下:

#! /bin/ksh
while(true)
do
        echo -n "."
        sleep 1
done &
BG_PID=$!
sleep 10
kill $BG_PID

       看到了吧,这里所谓的前台重要的工作就是sleep 10(根据需要自己换就可以了),当完成了,就用kill杀掉指定进程的部分,这里利用shell内部参数$!来获取进程,关于内部参数刚好我也总结了一下,如下图:

       

       你要觉得输出进度信息做成模块更好,那也挺简单,比如做一个函数啦,也可以放在单独的脚本里,我这里就不说了。

      (2)通过旋转的线指示进度:这种方式我就不解释了,现在好多好多的都是这样的,直接看脚本:

#! /bin/ksh
function rotate
{
        INTERVAL=0.05
        TCOUNT="0"
        while true
        do
                TCOUNT=`expr $TCOUNT + 1`
                case    $TCOUNT in
                        "1")    echo -e "-\b\c"
                                sleep   $INTERVAL
                                ;;
                        "2")    echo -e "\\b\c"
                                sleep   $INTERVAL
                                ;;
                        "3")    echo -e "|\b\c"
                                sleep   $INTERVAL
                                ;;
                        "4")    echo -e "/\b\c"
                                sleep   $INTERVAL
                                ;;
                        *)      TCOUNT="0";;
                esac
        done
}
rotate &
ROTATE_PID=$!
sleep 20
kill -9 $ROTATE_PID
       这里用到了函数,获得上一个进程ID(刚说过),还有就是echo控制符,因为我们要在同一个位置每过一段时间就将原来的清除掉重新写入新的内容,echo选项我刚好也总结了如下:

       

      (3)最后一种,莫过于倒计时了,各大系统都采用倒计时的方式来告诉用户的等待时间,这里就来说说这种方法,脚本如下:

#!/bin/ksh
if [ $# -ne 1 ];     #输入命令格式检查:名称+倒数时间
then
    echo "USAGE:  countdown.ksh  [seconds]"
    exit 0
fi
if [ $1 -gt 0 -a $1 -lt 1000 ];
then
   S=$1          #S指定为输入的
   echo -e "Seconds Remaining:  $S\c"
   echo -e "\n"
   sleep 1
   while [ $S -gt 0 ];   #如果时间不为0,就继续循环
   do
    if [ $S -lt "10" ];  #如果小于10,就向后退两位,再输出
    then
        echo -e "\b\b\c"
        echo -e "  \c"
        echo -e "\b\b\c"
    elif [ $S -ge "10" -a $S -lt "100" ];    #如果大等于10但小于100,就向后退三位,再输出
    then
                echo -e "\b\b\b\c"
                echo -e "   \c"
                echo -e "\b\b\b\c"
    elif [ $S -ge "100" -a $S -lt "1000" ];    #如果大等于100但小于1000,就向后退四位,再输出
    then
                echo -e "\b\b\b\b\c"
                echo -e "    \c"
                echo -e "\b\b\b\b\c"
    fi
    echo -e "$S\c"
    ((S = $S - 1))
    sleep 1
    done
    echo ""
else
        echo "Invalid input ==> $1"
        echo "Range 1 - 999 seconds"
        echo "Exiting..."
        exit 0
fi
      好了,这三种方法,应该足够控制你对时间进度的了解情况了,里边的脚本源码,特别是最后一个,我就不说了,shell就这样,不太好说清楚,只有试了的你才能明白其中的真谛哦.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值