跳轉到內容

Shell 程式設計/使用控制語句的示例程式碼

來自華夏公益教科書,開放書籍,構建開放世界

簡單的鬧鐘 - 使用控制語句的示例程式碼

[編輯 | 編輯原始碼]

以下程式碼假設使用 bash 環境,並且存在 dialog 工具。$1 表示第一個引數的值。程式碼第 18 行的無限迴圈在長時間執行後會消耗記憶體。

  #!/bin/bash
  #
  # Simple alarm clock
  # Author:mmmooonnnsssttteeerrr
  # GPL released
  time=`date +%H%M%S`
  default=060000
  quit=false
  alarm=$1
  help="Usage: alarm [%HH%MM%SS | default]\nDefault set to $default."
  if [ -z "$alarm" ]; then
      echo -e "$help"
      exit 1
  fi
  if [ "$1" = "default" ]; then
          alarm=$default
  fi
  until [ "$quit" = "true" ]; do
      dialog --title "alarm2" --infobox "Current time(%H%M%S)=$time\nAlarm set at $alarm. Ctrl+c to exit."  4 40
      sleep 1
      time=`date +%H%M%S`
      if [ "$time" = "$alarm" ]; then
          snooze=true
          until [ snooze = false ]; do
                  dialog --title "alarm2" --infobox "$alarm(%H%M%S) has arrived. Ctrl+c to exit." 3 70
                  echo -ne "\a"
                  sleep 1
          done
          quit=true
      fi
  done
  exit 0

簡單的鬧鐘2 - 使用控制語句的示例程式碼

[編輯 | 編輯原始碼]

這是一個另一個鬧鐘程式。這次程式碼更有效率,因為它使用了 sleep 命令而不是無限迴圈,因此記憶體洩漏的風險更小。程式碼第 7 行的 trap 命令捕獲訊號 INT(ctrl-c)並執行 cleanUp 函式作為後處理操作。

#!/bin/bash
# Author: mmmooonnnsssttteeerrr
# GPL
cleanUp() {
        exit 1
}
trap cleanUp INT
help="Usage: alarm3 [%H] [%M]"
if [ -z $2 ]; then
        echo $help
        exit 1
fi
time=`date +%H`
alarm=$1
sleepfor=""
# Have to calculate how long to sleep.
# Hours
if [ $alarm -lt $time ]; then
        sleepfor=`expr 24 - $time + $alarm`
        sleepfor=`expr $sleepfor "*" 60`
else
        sleepfor=`expr $alarm - $time`
        sleepfor=`expr $sleepfor "*" 60`
fi
# Minutes
time=`date +%M`
alarm=$2
if [ $alarm -lt $time ]; then
        sleepfor=`expr $(($sleepfor + 60 - $time + $alarm)) "*" 60`
else
        sleepfor=`expr $(($sleepfor + $alarm - $time)) "*" 60`
fi
sleep $sleepfor
soundAlarm() {
        for beep in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
        do
                [ $beep = 20 ] &&  break
                echo -ne "\a"
                sleep 1
        done
}
soundAlarm
exit 0

簡單的鬧鐘 3

[編輯 | 編輯原始碼]

實際上,這段程式碼是唯一一個可以作為鬧鐘正常工作的程式碼。它基於以下演算法

If a_h<T_h then (24-T_h+a_h)+a_m-T_m
If a_h>=T_h then (a_h-T_h)+a_m-T_m

其中 a_h 是 alarm_hour,T_h 是 Time_hour,a_m 是 alarm_minute,T_m 是 Time_minute。

#!/bin/bash
#
# Beeps at a given time accurate to +-1min
# mmmooonnnsssttteeerrr
#
# GPL
#
alarm_hour=$1
alarm_min=$2
alarm_min=`expr $alarm_min "*" 60`
time_hour=`date +%H`
time_min=`date +%M`
time_min=`expr $time_min "*" 60`
if [ -z $2 ]; then
       echo "alarm [%H] [%M]"
       exit 1
fi
trap `exit 1` INT
if [ $alarm_hour -lt $time_hour ]; then
       x=`expr $((24-$time_hour+$alarm_hour)) "*" 3600`
       sleepfor=`expr $x + $alarm_min - $time_min`
else
       y=`expr $((alarm_hour-time_hour)) "*" 3600`
       sleepfor=`expr $y + $alarm_min - $time_min`
fi
echo $sleepfor
sleep $sleepfor
for beep in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
       [ $beep = 20 ] && break
       echo -ne "\a"
       sleep 1
done
exit 0
華夏公益教科書