如何:bash中的进度条

时间:2014-05-13 11:51:43

标签: linux bash

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

[###########](40%)

更新后应该成为

[###############](50%)

然后类似地达到100%

有没有办法实现这个

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

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

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

8 个答案:

答案 0 :(得分: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

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

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

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

.../...

[ ################################# ] 100 % 

答案 1 :(得分:3)

您可以使用pv作为进度条:

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

答案 2 :(得分:3)

使用printf

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

输出:(在同一行...打印在不同的行上,用于演示。)

[                                                                                                   ]  0%
[######                                                                                             ]  6%
[############                                                                                       ] 12%
[##################                                                                                 ] 18%
[########################                                                                           ] 24%
[##############################                                                                     ] 30%
[####################################                                                               ] 36%
[##########################################                                                         ] 42%
[################################################                                                   ] 48%
[######################################################                                             ] 54%
[############################################################                                       ] 60%
[##################################################################                                 ] 66%
[########################################################################                           ] 72%
[##############################################################################                     ] 78%
[####################################################################################               ] 84%
[##########################################################################################         ] 90%
[################################################################################################   ] 96%

答案 3 :(得分:0)

您可以执行以下操作:

#!/bin/bash

func1() {
#reset
str=`printf '%*s' $1 ''|tr ' ' '#'`
echo -n "Loading Module: [ $str ] $1%Complete" $'\r'
#echo $processCounter
}

processCounter=0

while [  $processCounter -lt 100 ]; do

        #After Operation 1
        sleep 2
        let processCounter=processCounter+15
        func1 $processCounter

        #After operation 2
        sleep 2
        let processCounter=processCounter+35
        func1 $processCounter

done

sleep就是模拟应用程序安装所需的时间。

使用以上语法您可以执行以下操作

#!/bin/bash
{
    #echo -n "["
    for ((i = 0 ; i <= 100 ; i+=6)); do
        sleep 1
        str=`printf '%*s' $i ''|tr ' ' '#'`
        echo -n "[ $str ] $i %Complete" $'\r'
    done
    echo -n "]"
    echo
}

希望这会有所帮助!!

答案 4 :(得分:0)

使用tput命令

#!/bin/bash

x=0
load=''

TEST()
{

echo doin stuff


}
tput smcup

while [[ $x -lt 100  ]]; do
        TEST
        load="$load#"



         (( x = x + 1 ))
        echo "loading [" $load "] $x%"
        sleep 0.1
        if [[ $x -eq 100 ]]
        then
                echo done
                read -s LAL
        fi

        tput clear
done
tput clear
tput rmcup

答案 5 :(得分:0)

基于sed的方法:

for((i=1;i<=100;i++)); do
    printf "[%100s] $i%%\r" | sed -r "
          s/ /#/$i;
          h;
          s/.*#//;
          x;
          s/#.*/#/;
          s/ /#/g;
          G;
          s/\n//";
     sleep 0.1
 done;echo

说明:

  1. 打印字符串&#34; [&lt; 100个空格&gt;]进度号%\ r&#34;
  2. 用#
  3. 替换第一个空格
  4. 复制以容纳空间
  5. 用#&amp;分割字符串存储两个部分 - 一个在模式空间和一个一个在搁置空间。
  6. 用#
  7. 替换第一部分中的所有空格
  8. 加入两个字符串

答案 6 :(得分:0)

https://github.com/extensionsapp/progre.sh

创建24%的进度:progreSh 24

enter image description here

答案 7 :(得分:-1)

有很多选项,您可以像这样保存和恢复光标位置:

echo -e "\e[s 10 \e[u"
echo -e "\e[s 20 \e[u"

这是vt100终端控制命令之一,列表中的一个命令:

http://www.cse.psu.edu/~kyusun/class/cmpen472/11f/hw/hw7/vt100ansi.htm

或者只需使用\ r \ n每次将光标移动到行的开头并重绘条

echo -e "Original\rOverwrite"

\ r \ n更具可移植性,适用于大多数UNIX(不确定MacOS)

在你的例子中:

echo -n "["
for ((i = 0 ; i <= 100 ; i+=6)); do
    echo -ne "###\e[s] ($i%)\e[u"
    sleep 0.5
done
echo