我想在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
说明:
有很多选项,你可以保存和恢复光标位置,如下所示:
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