How to display countdown timer in bash shell script running on Linux/Unix

There are various ways to show a countdown in your shell scripts.
First define your message:
msg="Purging cache please wait..."
Now clear the screen and display the message at row 10 and column 5 using tput:
clear
tput cup 10 5
Next you need to display the message:
echo -n "$msg"
Find out the length of string:
l=${#msg}
Calculate the next column:
l=$(( l+5 ))
Finally use a bash for loop to show countdown:
for i in {30..01}
do
tput cup 10 $l
echo -n "$i"
sleep 1
done
echo
Here is a complete shell script:
#!/bin/bash # Purpose: Purge urls from Cloudflare Cache # Author: Vivek Gite {www.cyberciti.biz} under GPL v2.x+ # -------------------------------------------------------- # Set me first # zone_id="My-ID" api_key="My_API_KEY" email_id="My_EMAIL_ID" row=2 col=2 urls="$@" countdown() { msg="Purging ${1}..." clear tput cup $row $col echo -n "$msg" l=${#msg} l=$(( l+$col )) for i in {30..1} do tput cup $row $l echo -n "$i" sleep 1 done } # Do it for u in $urls do amp_url="${u}amp/" curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${zone_id}/purge_cache" \ -H "X-Auth-Email: ${email_id}" \ -H "X-Auth-Key: ${api_key}" \ -H "Content-Type: application/json" \ --data "{\"files\":[\"${u}\",\"${amp_url}\"]}" &>/dev/null && countdown "$u" done echo |
You can run it as follows:
./script.sh url1 url2
POSIX shell version
From this post:
countdown() ( IFS=: set -- $* secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} )) while [ $secs -gt 0 ] do sleep 1 & printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60)) secs=$(( $secs - 1 )) wait done echo ) |
It can be run as follows:
countdown "00:00:10" # 10 sec
countdown "00:00:30" # 30 sec
countdown "00:01:42" # 1 min 42 sec