Countdown with a status line
Sleep for N seconds while rewriting a message that can include $seconds.
18th August 2026
countdown() {
local seconds=${1:-0}
local message=${2:-''}
while [ "${seconds}" -gt 0 ]; do
eval_message=$(eval "echo ${message}")
echo -ne "${eval_message}\033[0K\r"
sleep 1
: $((seconds--))
done
echo
}
Caveats
The message is eval'd so $seconds updates. Do not pass untrusted message text.