Countdown Timer Using BASH Script

BASH 倒數計時程式

【摘要】用 BASH 指令寫的倒數計時程式,可直接複製使用。視窗儘量縮小,以免佔用太多空間。同樣的時間可多次倒數。


【目錄】

    【前言
    【指令檔一
    【指令檔二
    【後語

【前言】

一、想要有個倒數計時的程式,但不想安裝現成的,就自己用 BASH 寫了一、兩個記錄下來。本文曾在 Google 的 Blogger 發表過,近日加以修改更新,也提供大家參考。


二、設定倒數的時間可用一個、兩個、或三個數字,數字間用空格分開。

  • 輸入一個數字,則視為「秒」 (可超過 60)。
  • 輸入兩個數字,則分別視為「分」和「秒」 (皆可超過 60)。
  • 輸入三個數字,則分別視為「時」、「分」、「秒」。
  • 若輸入更多數字,只取前三個,忽略其餘的。

三、使用方法:

將【指令檔一】或【指令檔二】的內容存成 countdown.sh。然後執行:

lilyterm -T "Countdown Timer" -g 25x3 -e bash countdown.sh

  lilyterm 可改成各位喜好的虛擬終端機,也可能要修改選。
  虛擬終端機只開 25字元x3行 的大小是為了儘量縮小視窗佔據的空間


【指令檔一】


countdown-1

#!/bin/bash
 # 倒數計時(可多次倒數相同時間)
 
 # 設定時長
 # 輸入一個數字,則視為「秒」 (可超過 60)。
 # 輸入兩個數字,則分別視為「分」和「秒」 (皆可超過 60)。
 # 輸入三個數字,則分別視為「時」、「分」、「秒」。
 # 若輸入更多數字,只取前三個,忽略其餘的。
echo -e "請輸入倒數計時的 時 分 秒\n>> 時 分 秒"
read -p ">> " -a Time
 
 # 檢查輸入幾個數字
if [ -z ${Time[1]} ]
then
  Time[2]=${Time[0]}
  Time[1]=0
  Time[0]=0
elif [ -z ${Time[2]} ]
then
  Time[2]=${Time[1]}
  Time[1]=${Time[0]}
  Time[0]=0
fi
 
 # 計算總秒數
Sec=$(( (${Time[0]} * 60 * 60) + (${Time[1]} * 60) + ${Time[2]} ))
 
 # 轉換為 "時:分:秒" 格式
T="$((Sec/3600)):$(((Sec/60)%60)):$((Sec%60))"
 
 # 詢問同樣的時間共做幾次
echo -e "    請輸入倒數的次數\n     (預設為 1)"
read -p ">> " Repeat
if [ "${Repeat}" = "" ]; then Repeat=1; fi
 
 # 開始倒數
for (( i=${Repeat}; i>=1; i-- ))
do
  for (( t=${Sec}; t>=0; t-- ))
  do
     # 清除螢幕
    clear
     # 調整位置
    tput cup 1 7
     # 顯示時間
    echo -n "$((t/3600)) : $(((t/60)%60)) : $((t%60))   "
     # -n:不換行
     # 後面加些空格以覆蓋前面較長的內容
    sleep 1
     # 間隔一秒
  done
   # 結束時,用 Zenity 的 --notification 對話框通知
  zenity --notification --window-icon="error" --text="倒數 ${T} 第$((${Repeat}-${i}+1))次結束"
   # 也用 ALSA 的 aplay 播放鬧鈴
  aplay -q '/usr/share/audacity/nyquist/rawwaves/sinewave.raw'
   # -q:不顯示訊息
done
 
exit

【指令檔二】


countdown-2

#!/bin/bash
 # 執行倒數計時一次
 
 # 設定時長
 # 輸入一個數字,則視為「秒」 (可超過 60)。
 # 輸入兩個數字,則分別視為「分」和「秒」 (皆可超過 60)。
 # 輸入三個數字,則分別視為「時」、「分」、「秒」。
 # 若輸入更多數字,只取前三個,忽略其餘的。
echo "請輸入倒數計時的 時 分 秒"
read -p "數字用空格分開> " -a TIME
 
 # 檢查輸入幾個數字
if [ -z ${TIME[1]} ]
then
  TIME[2]=${TIME[0]}
  TIME[1]=0
  TIME[0]=0
elif [ -z ${TIME[2]} ]
then
  TIME[2]=${TIME[1]}
  TIME[1]=${TIME[0]}
  TIME[0]=0
fi
 
 # 計算總秒數
SEC=$(( (${TIME[0]} * 60 * 60) + (${TIME[1]} * 60) + ${TIME[2]} ))
 
 # 轉換為 "時:分:秒" 格式
T="$((SEC/3600)):$(((SEC/60)%60)):$((SEC%60))"
 
 # 清除螢幕
clear
 # 調整位置
echo
 # 等待開始
read -rsn 1 -p "按任何鍵即倒數 ${T}" dummy
 # -r:raw input,不解析 \
 # -s:不顯示輸入的字元
 # -n 1:只讀取一個字元
 # -p:顯示的文字
 # dummy:輸入的內容並沒有要用,所以隨便給個變數名
 
 # 清除螢幕
clear
 # 調整位置
echo
 # 開始倒數
for (( t=${SEC}; t>=1; t-- ))
do
  echo -ne "       $((t/3600)) : $(((t/60)%60)) : $((t%60)) \033[0K \r"
  # -n:不換行
  # -e:視 \ 為跳脫字元; \t 是橫向跳格 \r 是回到行首。
  # \033[0K 是清除本行內容;若不用,可在 \r 前加些空格,才能覆蓋前面較長的內容。
  sleep 1
  # 間隔一秒
done
 
 # 結束時,用 Zenity 的 --notification 對話框通知
zenity --notification --window-icon="error" --text="倒數 ${T} 結束"
 # 也用 ALSA 的 aplay 播放鬧鈴
aplay -q '/usr/share/audacity/nyquist/rawwaves/sinewave.raw'
 # -q:不顯示訊息
 
exit

【後語】

若想每隔一固定時間,就自動提醒一次,可以用 watch 指令。例如:

㈠ 每五分鐘發出一個音效:

watch -t -n 300 aplay -q '/usr/share/audacity/nyquist/rawwaves/sinewave.raw'

  -t:不顯示訊息
  -n:間隔秒數
  aplay:ALSA 的播放器
  -q:不顯示訊息

㈡ 若用螢幕通知:

watch -t -n 300 'zenity --notification --window-icon="error" --text="倒數五分鐘結束"'

發表留言