shell脚本中的进度指示器

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

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


 
!/bin/bash
functiondots(){
seconds=${1:-5}# print a dot every 5 seconds by default
whiletrue
do
    sleep$seconds
    echo-n'.'
done
}
 
dots 10 &
BG_PID=$!
trap"kill -9 $BG_PID"INT
 
# Do the real job here
sleep150
kill$BG_PID
echo

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

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


 
#!/bin/bash

function
rotate(){
INTERVAL=0.5
RCOUNT="0"
echo-n'Processing'
while:
do
    ((RCOUNT = RCOUNT + 1))
    case$RCOUNTin
        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
sleep15
kill-9 $ROTATE_PID
echo

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

3、使用pv显示进度

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


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

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


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

4. 使用dialog显示进度

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


 
foriin$(seq0 10 100) ;dosleep1; echo$i | dialog --gauge"Please wait"10 70 0;done

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


 
#!/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
    sleep1
    size_new=`stat -c"%s"$newfile`
done
) | dialog --title"File Copy"--gauge"cp $file $newfile"10 70 0

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

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

 
#!/bin/sh
cp_p()
{
   strace-q -ewritecp--"${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
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell脚本运行另一个Shell脚本可以通过两种方式实现。第一种方式是在当前进程运行另一个Shell脚本,可以使用source命令或点号(.)来执行。这样做会将另一个Shell脚本的内容直接插入到当前Shell脚本的执行环境,不会创建新的进程。例如,可以使用以下命令来运行另一个Shell脚本: ``` source 另一个脚本.sh . 另一个脚本.sh ``` 第二种方式是在新的进程运行另一个Shell脚本,可以使用以下命令来执行: ``` ./另一个脚本.sh ``` 在这种情况下,需要为另一个Shell脚本添加可执行权限,并指定正确的路径。注意,这种方式会创建一个新的Shell进程来执行另一个脚本。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Shell脚本【2】写和运行Shell脚本](https://blog.csdn.net/qq_43624033/article/details/106455124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [shell----shell脚本的运行](https://blog.csdn.net/weixin_45606836/article/details/104377197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值