Pessoalmente, eu refatorei isso um pouco para facilitar a leitura (ainda confiando na data do GNU)
function countdown(){
local now=$(date +%s)
local end=$((now + $1))
while (( now < end )); do
printf "%s\r" "$(date -u -d @$((end - now)) +%T)"
sleep 0.25
now=$(date +%s)
done
echo
}
Mapeando as chamadas de data para a data do BSD do OSX ( página man aqui )
Parece a invocação da data do GNU
date -u -d @$((end - now)) +%T
traduz essa invocação de data do BSD
date -u -j -f %s $((end - now)) +%T
mas isso não foi testado.