Skip to content

Instantly share code, notes, and snippets.

@tdussa
Last active December 11, 2021 08:08
Show Gist options
  • Save tdussa/be52aa5460e0390def8b9578dca4c64b to your computer and use it in GitHub Desktop.
Save tdussa/be52aa5460e0390def8b9578dca4c64b to your computer and use it in GitHub Desktop.
Simple shell countdown
#! /bin/sh
if [ -z "$1" ]; then
echo "Missing argument! Usage:"
echo -e "\t$0 <time string>"
exit 1
fi
TARGET=$(date -d"$1" "+%s")
TOGO=$((TARGET-$(date "+%s")))
CLEARLINE='\r\033[2K'
BOLD='\033[1m'
NORMAL='\033[0m'
if [ ${TOGO} -le 0 ]; then
echo "Target time not in the future; difference is ${TOGO} seconds."
exit 2
fi
# Years to go?
PERIOD=$((365*24*60*60))
while [ ${TOGO} -gt ${PERIOD} ]; do
printf "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") T minus ${BOLD}%i${NORMAL} years, ${BOLD}%02i${NORMAL} days, ${BOLD}%02i${NORMAL} hours, ${BOLD}%02i${NORMAL} minutes, ${BOLD}%02i${NORMAL} seconds" \
$((TOGO/PERIOD)) \
$(($((TOGO%PERIOD))/$((PERIOD/365)))) \
$(($((TOGO%$((PERIOD/365))))/$((PERIOD/365/24)))) \
$(($((TOGO%$((PERIOD/365/24))))/$((PERIOD/365/24/60)))) \
$((TOGO%$((PERIOD/365/24/60))))
if [ $((TOGO%PERIOD)) -gt 0 ]; then
sleep $((TOGO%PERIOD))
else
if [ $((TOGO/PERIOD)) -gt 10 ]; then
if [ $((TOGO%$((10*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((10*PERIOD))))
else
sleep $((10*PERIOD))
fi
else
sleep ${PERIOD}
fi
fi
TOGO=$((TARGET-$(date "+%s")))
done
# Days to go?
PERIOD=$((PERIOD/365))
while [ ${TOGO} -gt ${PERIOD} ]; do
printf "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") T minus ${BOLD}%02i${NORMAL} days, ${BOLD}%02i${NORMAL} hours, ${BOLD}%02i${NORMAL} minutes, ${BOLD}%02i${NORMAL} seconds" \
$((TOGO/PERIOD)) \
$(($((TOGO%$((PERIOD))))/$((PERIOD/24)))) \
$(($((TOGO%$((PERIOD/24))))/$((PERIOD/24/60)))) \
$((TOGO%$((PERIOD/24/60))))
if [ $((TOGO%PERIOD)) -gt 0 ]; then
sleep $((TOGO%PERIOD))
else
if [ $((TOGO/PERIOD)) -gt 10 ]; then
if [ $((TOGO/PERIOD)) -gt 100 ]; then
if [ $((TOGO%$((100*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((100*PERIOD))))
else
sleep $((100*PERIOD))
fi
else
if [ $((TOGO%$((10*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((10*PERIOD))))
else
sleep $((10*PERIOD))
fi
fi
else
sleep ${PERIOD}
fi
fi
TOGO=$((TARGET-$(date "+%s")))
done
# Hours to go?
PERIOD=$((PERIOD/24))
while [ ${TOGO} -gt ${PERIOD} ]; do
printf "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") T minus ${BOLD}%02i${NORMAL} hours, ${BOLD}%02i${NORMAL} minutes, ${BOLD}%02i${NORMAL} seconds" \
$((TOGO/PERIOD)) \
$(($((TOGO%$((PERIOD))))/$((PERIOD/60)))) \
$((TOGO%$((PERIOD/60))))
if [ $((TOGO%PERIOD)) -gt 0 ]; then
sleep $((TOGO%PERIOD))
else
if [ $((TOGO/PERIOD)) -gt 10 ]; then
if [ $((TOGO%$((10*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((10*PERIOD))))
else
sleep $((10*PERIOD))
fi
else
sleep ${PERIOD}
fi
fi
TOGO=$((TARGET-$(date "+%s")))
done
# Minutes to go?
PERIOD=$((PERIOD/60))
while [ ${TOGO} -gt ${PERIOD} ]; do
printf "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") T minus ${BOLD}%02i${NORMAL} minutes, ${BOLD}%02i${NORMAL} seconds" \
$((TOGO/PERIOD)) \
$((TOGO%$((PERIOD))))
if [ $((TOGO%PERIOD)) -gt 0 ]; then
sleep $((TOGO%PERIOD))
else
if [ $((TOGO/PERIOD)) -gt 10 ]; then
if [ $((TOGO%$((10*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((10*PERIOD))))
else
sleep $((10*PERIOD))
fi
else
sleep ${PERIOD}
fi
fi
TOGO=$((TARGET-$(date "+%s")))
done
# Seconds to go?
PERIOD=$((PERIOD/60))
while [ ${TOGO} -ge ${PERIOD} ]; do
printf "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") T minus ${BOLD}%02i${NORMAL} seconds" \
${TOGO}
if [ $((TOGO/PERIOD)) -gt 10 ]; then
if [ $((TOGO%$((10*PERIOD)))) -gt 0 ]; then
sleep $((TOGO%$((10*PERIOD))))
else
sleep $((10*PERIOD))
fi
else
sleep ${PERIOD}
fi
TOGO=$((TARGET-$(date "+%s")))
done
echo -e "${CLEARLINE}$(date "+%Y-%m-%dT%H:%M:%S%Z: ") ${BOLD}T reached${NORMAL}!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment