如何:bash中的进度条

Ank*_*mar 2 linux bash

我想在bash操作期间以特定格式显示进度条,类似于以下内容:

[###########](40%)
Run Code Online (Sandbox Code Playgroud)

更新后应该成为

[###############](50%)
Run Code Online (Sandbox Code Playgroud)

然后类似地达到 100%

有没有办法实现这一目标

我写了下面的bash程序,但我不知道如何在同一行显示这个百分比:

#!/bin/bash
{
    echo -n "["
    for ((i = 0 ; i <= 100 ; i+=6)); do
        sleep 0.05
        echo -n "###"
    done
    echo -n "]"
    echo
}
Run Code Online (Sandbox Code Playgroud)

假设在循环中执行了一定数量的操作,并且在每个操作完成之后,我想报告一些进展.我不想安装pv或没有默认Ubuntu 12.04安装的任何其他实用程序.

fed*_*qui 6

让我们echo -n '...' $'\r'用来打印一个回车:

for ((k = 0; k <= 10 ; k++))
do
    echo -n "[ "
    for ((i = 0 ; i <= k; i++)); do echo -n "###"; done
    for ((j = i ; j <= 10 ; j++)); do echo -n "   "; done
    v=$((k * 10))
    echo -n " ] "
    echo -n "$v %" $'\r'
    sleep 0.05
done
echo
Run Code Online (Sandbox Code Playgroud)

它使光标移动到行的开头以保持打印.

输出如下,始终在同一行:

[ ##################                ] 50 % 

.../...

[ ################################# ] 100 % 
Run Code Online (Sandbox Code Playgroud)


ani*_*ane 6

使用printf

for((i=0;i<=100;i+=6)); do
    printf "%-*s" $((i+1)) '[' | tr ' ' '#'
    printf "%*s%3d%%\r"  $((101-i))  "]" "$i"
    sleep 0.1
done; echo
Run Code Online (Sandbox Code Playgroud)

输出:(在同一行中..在此处打印在不同行上以进行演示。)

[                                                                                                   ]  0%
[######                                                                                             ]  6%
[############                                                                                       ] 12%
[##################                                                                                 ] 18%
[########################                                                                           ] 24%
[##############################                                                                     ] 30%
[####################################                                                               ] 36%
[##########################################                                                         ] 42%
[################################################                                                   ] 48%
[######################################################                                             ] 54%
[############################################################                                       ] 60%
[##################################################################                                 ] 66%
[########################################################################                           ] 72%
[##############################################################################                     ] 78%
[####################################################################################               ] 84%
[##########################################################################################         ] 90%
[################################################################################################   ] 96%
Run Code Online (Sandbox Code Playgroud)


per*_*eal 5

您可以将pv其用作进度条:

{
    for ((i = 0 ; i <= 100 ; i+=6)); do
        sleep 0.5 
        echo "B"
    done | pv -c -s 34 > /dev/null
}
Run Code Online (Sandbox Code Playgroud)