相信大家做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就这样,不太好说清楚,只有试了的你才能明白其中的真谛哦.