case 语句是多级的if…then…else…fi语句很好的代替方式。它可以让一个条件与多个模式相比较,而且case语句结构的读写比较方便。
(一)语法结构
case语句的语法如下图所示:
case EXPRESSION in
PATTERN1)
CONSEQUENT-COMMANDS
;;
PATHERN2)
CONSEQUENT-COMMANDS
;;
PATHEN3)
CONSEQUENT-COMMANDS
;;
......
PATHENn)
CONSEQUENT-COMMANDS
;;
esec
注意:case语句结构一定要以“esac”结尾,每一个命令列表都以两个分号“;;”为终结,只有最后一个命令列表的(即esec之前的)“;;”可以被省略。
(二)脚本应用示例
1.实例一
- 任务目标
- Linux信号处理脚本
$ cat killsignal.sh
#!/bin/bash
#######################################################
#
# FILE:killsignal
# USAGE: ./killsignal
#
# DESCRTPTION:
# OPTIONS: --
# REPUIREMENTS: --
# BUGS: --
# NOTES: --
# AUTHOR: LEY
# ORGANIZATION:
# CREATED: 04/17/2024 15:04
# REVISION: --
#####################################################
#如果指定给脚本的命令行参数的数目小于2,则显示脚本的使用方法信息并退出
if [ $# -lt 2 ]
then
echo "Usage : $0 signalnumber pid"
exit
fi
case "$1" in
1)
echo "Seding SIGHUP signal to PID $2."
# 向指定的PID发送SIGHUP信号
kill -SIGHUP $2
;;
2)
echo "Seding SIGINT signal to PID 42."
#向指定的PID发送SIGINT信号
kill -SIGINT $2
;;
3)
echo "Seding SIGQUIT signal to PID $2."
# 向指定的PID发送SIGQUINT信号
kill -SIGQUIT $2
;;
9)
echo "Seding SIGKILL signal to PID $2."
# 向指定的PID发送SIGKILL信号
kill -SIGKILL $2
;;
*)
echo "Signal number $1 is not processed."
;;
esac
运行此脚本得到的类似如下的结果:
$ sleep 60 &
[1] 2983
$ ./killsignal.sh 10 2983
Signal number 10 is not processed.
$ ./killsignal.sh 9 2983
Seding SIGKILL signal to PID 2983.
[1]+ Killed sleep 60
上述脚本中,特殊变量$1和$2分别是指定的信号值和进程号。使用kill命令,它会发送相应的信号到指定的进程。最后一个模式匹配项“*)” 表示的默认匹配项,即表示若脚本“1)、2)、3)、9)”都没有被匹配,则匹配此项。
2.实例二
- 任务目标
- 多重模式匹配case语句的脚本,判断今天星期几来进行不同模式的备份。
[ley@controller ~]$ cat backuo.sh
#!/bin/bash
#######################################################
#
# FILE:backup
# USAGE: ./backup
#
# DESCRTPTION:
# OPTIONS: --
# REPUIREMENTS: --
# BUGS: --
# NOTES: --
# AUTHOR: LEY
# ORGANIZATION:
# CREATED: 04/17/2024 15:36
# REVISION: --
#####################################################
#得到今天星期几
NOW=$(date +%a)
case $NOW in
#若是星期一
Mon)
echo "Full backup"
;;
#若今天是星期二、三、四、五
Tue | Wed | Thu | Fri)
echo "Partial backup"
;;
#若今天为星期天
Sat | Sun)
echo "No backup"
;;
*)
;;
esac