如何:在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安装。

让我们用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 % 

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

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

使用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% 

你可以做如下的事情:

 #!/bin/bash func1() { #reset str=`printf '%*s' $1 ''|tr ' ' '#'` echo -n "Loading modulee: [ $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 

睡眠只是为了模拟应用程序安装所需的时间。

使用上面的语法你可以做如下

 #!/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 } 

希望这可以帮助!!

使用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 

基于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. 打印字符串“[<100 space here>]进度号%\ r”
  2. 用#替换我的空间#
  3. 复制以保存空间
  4. 分割字符串#存储这两个部分 – 一个模式空间和一个保留空间。
  5. 用#替换第一部分中的所有空格
  6. 加入这两个字符串

有很多选项,你可以保存和恢复光标位置,如下所示:

 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将光标移动到每行的开头并重新绘制栏

 echo -e "Original\rOverwrite" 

\ r更便携,可以在大多数UNIX上运行(不确定MacOS)

在你的例子中:

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