Linux + 如何在 bash 中创建简单的进度条

Linux + 如何在 bash 中创建简单的进度条

我想在 bash 脚本中添加一个显示“.”的进度条。字符作为进度,并且过程在 MAX 180 秒后结束

在bash脚本中我使用curl命令,因此curl在一段时间后给出结果,但不超过180秒

类似的东西

|.                                           after 2 sec
|...........                                 after 60 sec
|...................                         after 100 sec
|..........................                  after 150 sec
|................................|           after 180 sec 

最后的例子

|................................|       after 180 sec 

或者

|....|                                   after 30 sec 

答案1

在普通的 Bash 中做到这一点相当简单:

#!/bin/bash
# progress bar function
prog() {
    local w=80 p=$1;  shift
    # create a string of spaces, then change them to dots
    printf -v dots "%*s" "$(( $p*$w/100 ))" ""; dots=${dots// /.};
    # print those dots on a fixed-width space plus the percentage etc. 
    printf "\r\e[K|%-*s| %3d %% %s" "$w" "$dots" "$p" "$*"; 
}
# test loop
for x in {1..100} ; do
    prog "$x" still working...
    sleep .1   # do some work here
done ; echo

第一个参数prog是百分比,其他任何参数都打印在进度条之后。w函数中的变量控制条形的宽度。完成后打印换行符,该函数不打印换行符。


另一种可能性是使用该pv工具。它的目的是测量管道的吞吐量,但我们可以为其创建一个:

for x in {1..100} ; do
    sleep .1    # do some work here
    printf .
done | pv -pt -i0.2 -s100 -w 80 > /dev/null

在这里,-pt启用进度条和计时器,-s 100设置总输出大小,并且我们在函数内打印的任何内容都会根据该大小进行计数。

答案2

一般来说,您可以通过覆盖一行来实现这一点。用于\r返回到行的开头而不写入\n终端。

当你完成后写下\n推进线。

用于echo -ne

  • 不打印\n并且
  • 识别转义序列,例如\r.

这是一个演示:

echo -ne '...                     (33%)\r'
sleep 1
echo -ne '......                  (66%)\r'
sleep 1
echo -ne '..........              (100%)\r'
echo -ne '\n'

编辑:现在,cURL 带有一个进度条:--progress-bar,这不是你想要的吗?

取自答案https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script

发现用Google,第一个答案,搜索词如下:“bash进度条”

相关内容