shell脚本中模拟Linux和BSD风格的进度条

使用Unix的朋友们恐怕都对Linux中加载内核时的"Loading Vmlinuz..........."
或BSD boot时旋转的卫星小信号映像颇深,其实我们也可以在自己的脚本中模拟
这样的动态进度条。使用下面两个脚本的模式,替换程序主体为你自己的脚本。
虽然有少许缺陷,但是一样有不小的乐趣哦。


程序1:模拟Linux loading kernel
CODE

#####################################################################
#!/bin/sh
#输出"."进度条函数,兼容bsh、ksh、bash
#首先trap 1 2 3 15信号,重要

trap 'kill $BG_PID;echo;exit' 1 2 3 15

function dots
{
stty -echo >/dev/null 2>&1
while true
do
 echo ".\c"
 sleep 1  
done
stty echo
echo
}

#---------------------------------------------
# 主程序开始
#---------------------------------------------

#首先使dots函数后台运行
dots &
BG_PID=$!

#开始程序主体,本例中执行休眠10秒
#注意必要时使用 >/dev/null 2>&1关闭输出和错误回显,避免破坏显示
sleep 10

#程序结尾注意kill dots,否则dots会一直执行
kill $BG_PID

#####################################################################




程序2:模拟FreeBSD loading kernel
CODE

#####################################################################
#!/bin/sh
#输出"*"进度条函数,兼容bsh、ksh、bash
#首先trap 1 2 3 15信号,重要

trap 'kill $BG_PID;echo;exit' 1 2 3 15

function rotate
{
INTERVAL=0.1         #进度条旋转时间0.1秒,注意并不是所有系统都支持非整数
TCOUNT="0"                
stty -echo >/dev/null 2>&1
while :
do
TCOUNT=`expr $TCOUNT + 1`
  case $TCOUNT in
  "1") echo '-'"\b\c"
  sleep $INTERVAL
 ;;
  "2") echo '\\'"\b\c"
  sleep $INTERVAL
 ;;
  "3") echo "|\b\c"
  sleep $INTERVAL
 ;;
  "4") echo "/\b\c"
  sleep $INTERVAL
 ;;
  *) TCOUNT="0";;
  esac
done
stty echo
}


#---------------------------------------------
# 主程序开始
#---------------------------------------------

#首先使rotate函数后台运行
rotate &
ROTATE_PID=$!

#开始程序主体,本例中执行休眠10秒
#注意必要时使用 >/dev/null 2>&1关闭输出和错误回显,避免破坏显示
sleep 10

#程序结尾注意kill dots,否则dots会一直执行;清除多余字符
kill -9 $ROTATE_PID
echo "\b\b"

#####################################################################


.

作者: freedemon   发布时间: 2005-02-26

这么好的东西为什么没人顶!!!

作者: lozity   发布时间: 2005-03-02

我还没用过Linux & BSD
只现在用AIX 不会把系统搞瘫痪了吧。收藏先,等那天试一下。

作者: huoran   发布时间: 2005-03-24

偶以为只能用ncurses才能实现的

作者: Komtas   发布时间: 2005-03-24

下次做安装程序时带上

作者: Komtas   发布时间: 2005-03-24

it is wanderful!
i've test them on aix 5.1
both of them work fine
thanks

作者: wf201626   发布时间: 2005-03-24

对于这个脚本:BSD boot时旋转的卫星小信号
程序运行结束后,屏幕上会打印一个字符出来,比如"\",如何消掉

作者: rofee   发布时间: 2005-04-15

原帖由 rofee 于 2005-4-15 14:26 发表
对于这个脚本:BSD boot时旋转的卫星小信号<br />程序运行结束后,屏幕上会打印一个字符出来,比如"\",如何消掉

只需将echo "\b\b"改为echo "\b \b"

另:第一种最好在kill $BG_PID前加上echo,以便回车换行。

作者: w_xl   发布时间: 2005-10-19

ding~~~~~~~~~~~~~~~~

作者: renminyan   发布时间: 2007-06-05

强贴必留名,收藏!!!!

作者: showbu   发布时间: 2007-08-14

学习了!

作者: aix9030   发布时间: 2007-09-13

强贴必留名,收藏中!!!

作者: awk   发布时间: 2008-05-21

好东西!

作者: wxr001   发布时间: 2008-12-08

支持一下啊

作者: mb0123   发布时间: 2009-01-02

强贴必留名,收藏中!!!

作者: lyrryl   发布时间: 2009-01-03

我想先到LINUX上试验下,能好我就到AIX上用下

作者: zhang_box   发布时间: 2011-11-12