Skip to content

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.