我希望在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
的实用程序。
答案 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
说明:
答案 6 :(得分:0)
答案 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