shell脚本中的进度指示器

在脚本或者程序运行时间较长时,为终端用户提供反馈信息,表示脚本或程序在辛勤工作,是非常重要的。本文将介绍常见的两种进度指示器(一系列原点和一条旋转线)以及一些其他提供进度指示的工具。

1. 使用一系列原点来指示进度

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#!/bin/bash

function dots(){

seconds=${1:-5} # print a dot every 5 seconds by default

while true

do

    sleep $seconds

    echo -n ‘.‘

done

}

dots 10 &

BG_PID=$!

trap "kill -9 $BG_PID" INT

# Do the real job here

sleep 150

kill $BG_PID

echo

dots函数每隔一段时间打印一个圆点,这个时间值可以通过第一个参数传入,否则默认为5秒。在后台启动dots函数之后,通过"$!"获取dots的pid,然后开始执行耗时的工作,在工作执行完毕之后kill掉后台执行的dots。trap命令是为了防止用户Ctrl_C中断脚本执行的时候dots仍然在后台执行。

2. 使用一条旋转线来表示进度

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#!/bin/bash

function rotate(){

INTERVAL=0.5

RCOUNT="0"

echo -n ‘Processing‘

while :

do

    ((RCOUNT = RCOUNT + 1))

    case $RCOUNT 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

            ;;

        *) RCOUNT=0

            ;;

    esac

done

}

rotate &

trap "kill -9 $BG_PID" INT

ROTATE_PID=$!

# Do the job here

sleep 15

kill -9 $ROTATE_PID

echo

为了使用一条旋转线来作为进度指示器,可以通过按顺序逐个显示/-\|然后重复这个过。为使这一字符序列无缝地显示,需要对前一个字符退格显示并删除它,或者用一个新字符来覆盖它,使得看起来好像一条线在旋转。

3、使用pv显示进度

pv(Pipe Viewer)可以显示通过管道的内容的数据通过量、数据通过速度、已用时间、估计剩余时间(ETA)、通过百分比等信息。在使用的时候,可以将pv插在两个进程的管道之间,并提供恰当的参数。比如为了查看tar备份的速度,可以用

?


1

tar czf - /path/to/some/directory/*  | pv > backup.tar.gz

为了查看cp的速度,可以用

?


1

file=/path/to/some/file size=`ls -sk $file | awk ‘{print $1}‘` && pv -s ${size}k $file > /desination/filename

4. 使用dialog显示进度

dialog是一种在shell脚本里显示对话框的工具,其提供的--gauge可以用来作为进度条使用,其中进度大小从标准输入读入。下面是一个简单的例子:

?


1

for i in $(seq 0 10 100) ; do sleep 1; echo $i | dialog --gauge "Please wait" 10 70 0; done

下面的脚本提供对cp进度的显示

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/bin/bash

file=$1

newfile=$2

filename=`basename $file`

if [ -d $newfile ]; then

    newfile=$newfile/$filename

fi

cp $file $newfile &

CP_PID=$!

trap ‘kill -9 $CP_PID‘ INT

size_old=`stat -c "%s" $file`

size_new=`stat -c "%s" $newfile`

(

while [ $size_new -lt $size_old ];

do

    echo "$size_new * 100 / $size_old" | bc

    sleep 1

    size_new=`stat -c "%s" $newfile`

done

) | dialog --title "File Copy" --gauge "cp $file $newfile" 10 70 0

5. 另一种对cp提供进度显示的方法

这种方法来自这里 ,代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#!/bin/sh

cp_p()

{

   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \

      | awk ‘{

        count += $NF

            if (count % 10 == 0) {

               percent = count / total_size * 100

               printf "%3d%% [", percent

               for (i=0;i<=percent;i++)

                  printf "="

               printf ">"

               for (i=percent;i<100;i++)

                  printf " "

               printf "]\r"

            }

         }

         END { print "" }‘ total_size=$(stat -c ‘%s‘ "${1}") count=0

}

原文地址:https://www.cnblogs.com/zhangrui153169/p/11508123.html

时间: 2024-08-29 14:09:01

shell脚本中的进度指示器的相关文章

详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息对话框弹出,需要你的输入.对话框的类型有密码箱,检查表,菜单,等等.他们可以引导你以一种直观的方式输入必要的信息,使用这样的用户友好的对话框的好处是显而易见的.如下图所示: 当你写一个交互式shell脚本,你可以使用这样的对话框来接受用户的输入.whiptail可以在shell脚本中创建基于终端的对

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

在shell脚本中进行条件控制以及使用循环

转载请标明:http://www.cnblogs.com/winifred-tang94/ if条件语句语法: if [ 条件表达式 ] then 代码 else 代码 fi 注意:在上面的if条件语句中,if和 [ 之间要有空格,而条件表达式和两边的 [ ] 都要有空格,条件表达式不能紧挨着 [ 和 ]. if条件表达式以fi结束. Eg. 结果出现了以下问题: 原因是因为开头在#!后还要有一个/,加上/后解释器错误没有了,代码如下: 可是仍然有没有那个文件或目录的错误.对于这个错误我觉得是e

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

shell脚本中实现自动判断用户有无密码

在最近完成老师布置的作业的时候遇到了如何让shell脚本中的命令自动判断一个用户是否已设置密码的问题,虽然看似不是很难的一个问题,但是在这一功能实现的过程中却包含了许多细小的而重要的知识.刚开始小编对此很是头疼,虽然我们查看一个用户是否有密码并不是很难,直接cat /etc/shadow这个文件看看密码位是否有加密的字符就行了,但是让命令自己去判断和匹配就不是很顺利了,小编上网查看后,并没有得到很好的答案,大多数都是人工查看的答案,并不适用于shell脚本中自动的判断,所以在认真对比/etc/p

shell脚本中echo显示内容带颜色

转自:http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色 注:  1.字背景颜

Linux/Unix shell 脚本中调用SQL,RMAN脚本

Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例. 一.由shell脚本调用sql,rman脚本 [python] view plain copy print? 1.shell脚本调用sql脚本 #首先编辑sql文件 [email protecte

在shell脚本中使用函数

转载请标明:http://www.cnblogs.com/winifred-tang94/ 对于在脚本中重复使用的功能模块,可以封装成为函数. shell脚本中函数的定义可以使用如下两种方式: a. 函数名() { ······· } b. function 函数名() { ·········· } eg. 结果为: 值得注意的是,如果判断相等哪里想用test指令的话,应该使用如下的格式: