Linux 如何: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 "#

我希望在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
}
[ ##################                ] 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