A progressbar for shell scripts inspired by APT
For a POSIX compliant version see instructions in branch POSIX
Put this anywhere in your script by using cURL
. <(curl -sLo- "https://git.io/progressbar")
or by using wget
. <(wget -qO- "https://git.io/progressbar")
Make a call to
bar::start
before any progress should be reported. This will setup the status line by shrinking the terminal scroll area by one row. Then determine the total steps to be reported - either you're using this in a loop or do manual reporting in your script. What ever way suits your needs, make a call to
bar::status_changed <steps done> <total steps>
whenever progress is made. This function will then determine if the status line should be updated.
Finally make a call to
bar::stop
when you're done and this function will restore the terminal size.
#!/usr/bin/env bash
. <(curl -sLo- "https://git.io/progressbar")
bar::start
StuffToDo=("Stuff1" "Stuff2" "Stuff3")
TotalSteps=${#StuffToDo[@]}
for Stuff in ${StuffToDo[@]}; do
# Do stuff
echo "Invoking ${Stuff} to do some stuffs..."
StepsDone=$((${StepsDone:-0}+1))
bar::status_changed $StepsDone $TotalSteps
sleep 1
done
bar::stop
If you want to customize your progress string then change the following variables, shown below with defaults
LEFT_BRACKET=${LEFT_BRACKET:-"["}
RIGHT_BRACKET=${RIGHT_BRACKET:-"]"}
FILL=${FILL:-"#"}
REMAIN=${REMAIN:-"."}
You can change foreground and background color by setting these variables
foreground="$(tput setaf 0)" # black
background="$(tput setab 2)" # green
you can also tweak how often reporting should be done (in case of great number of steps and quick progressing) by setting reporting_steps
to a value bigger than 1