BASH 倒數計時程式
【摘要】用 BASH 指令寫的倒數計時程式,可直接複製使用。視窗儘量縮小,以免佔用太多空間。同樣的時間可多次倒數。
【目錄】
【前言】【指令檔一】
【指令檔二】
【後語】
【前言】
一、想要有個倒數計時的程式,但不想安裝現成的,就自己用 BASH 寫了一、兩個記錄下來。本文曾在 Google 的 Blogger 發表過,近日加以修改更新,也提供大家參考。
二、設定倒數的時間可用一個、兩個、或三個數字,數字間用空格分開。
- 輸入一個數字,則視為「秒」 (可超過 60)。
- 輸入兩個數字,則分別視為「分」和「秒」 (皆可超過 60)。
- 輸入三個數字,則分別視為「時」、「分」、「秒」。
- 若輸入更多數字,只取前三個,忽略其餘的。
三、使用方法:
將【指令檔一】或【指令檔二】的內容存成 countdown.sh。然後執行:
lilyterm -T "Countdown Timer" -g 25x3 -e bash countdown.sh
lilyterm
可改成各位喜好的虛擬終端機,也可能要修改選。
虛擬終端機只開 25字元x3行 的大小是為了儘量縮小視窗佔據的空間
【指令檔一】
#!/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
【指令檔二】
#!/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="倒數五分鐘結束"'