How to: Progress bar in bash

Let's use echo -n '...' $'\r' to print a carriage return:

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

It makes the cursor move to the beginning of the line to keep printing.

Output is as follows, always in the same line:

[ ##################                ] 50 % 

.../...

[ ################################# ] 100 % 

Using 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

Output: (in same line.. printed on different lines here for demo.)

[                                                                                                   ]  0%
[######                                                                                             ]  6%
[############                                                                                       ] 12%
[##################                                                                                 ] 18%
[########################                                                                           ] 24%
[##############################                                                                     ] 30%
[####################################                                                               ] 36%
[##########################################                                                         ] 42%
[################################################                                                   ] 48%
[######################################################                                             ] 54%
[############################################################                                       ] 60%
[##################################################################                                 ] 66%
[########################################################################                           ] 72%
[##############################################################################                     ] 78%
[####################################################################################               ] 84%
[##########################################################################################         ] 90%
[################################################################################################   ] 96%

You can use pv as the progress bar:

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