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
這是一個另一個鬧鐘程式。這次程式碼更有效率,因為它使用了 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
實際上,這段程式碼是唯一一個可以作為鬧鐘正常工作的程式碼。它基於以下演算法
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