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
}