Linux 如何:bash中的进度条
我希望在bash操作期间以特定格式显示进度条,类似于以下内容:Linux 如何:bash中的进度条,linux,bash,Linux,Bash,我希望在bash操作期间以特定格式显示进度条,类似于以下内容: [###########](40%) 更新后,它应该成为 [###############](50%) 然后同样达到100% 有没有办法做到这一点 我编写了以下bash程序,但我不知道如何在同一行中显示百分比: #!/bin/bash { echo -n "[" for ((i = 0 ; i <= 100 ; i+=6)); do sleep 0.05 echo -n "#
[###########](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
}
[ ################## ] 50 %
.../...
[ ################################# ] 100 %
#/bin/bash
{
回声-n“[”
对于((i=0;i您可以使用pv
作为进度条:
{
for ((i = 0 ; i <= 100 ; i+=6)); do
sleep 0.5
echo "B"
done | pv -c -s 34 > /dev/null
}
{
对于((i=0;i/dev/null)
}
有很多选项,您可以像这样保存和恢复光标位置:
echo -e "\e[s 10 \e[u"
echo -e "\e[s 20 \e[u"
这是vt100终端控制命令之一,列表中的命令之一:
或者只需使用\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
echo-n“[”
对于((i=0;i您可以执行以下操作:
#!/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
睡眠只是模拟应用程序安装所需的时间
使用上述语法,您可以执行以下操作
#!/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
}
!/bin/bash
{
#回声-n“[”
对于((i=0;i使用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
让我们使用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
使用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
基于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
((i=1;i
创建24%的进度:progreSh 24
是否必须是那种特定的格式?正常的进度条不起作用吗?@zmo但是在这种解决方案中,你必须写这么多的echo
语句,难道没有更好的方法吗。像循环中的echo
之类的东西吗?@darnir你指的是什么其他格式?你能解释一下吗rst答案解释了在一行上制作进度条的ASCII技巧,而其他答案则给出了不同的方法。最好的方法是使用bar
程序。@dreamer:我不知道重复的问题。我要指向pv
和bar
等实用程序。我不想安装任何工具Ubuntu 12.04安装中默认不提供的工具。$'\r'是如何工作的?美元做什么?只是curious@Jidder它返回到行首,而不返回下一行。使用$
可以指示特定字符的打印,而不是文本\r
。因此与在echo?J上使用-e选项相同我以前从来没见过这么做。顺便说一句,回答得不错。
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