case 语句和 if...elif...else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
case语句的语法结构:
case 变量 in
condition1)
command....
;;
condition2)
command....
;;
condition3)
command....
;;
*)
#无匹配条件后的命令序列
esac
case语句应该注意一下几点:
- case 语句会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程,之后就不会在往下走;如果数值不符,则依次比较下一个值;如果所有的值都不符合,则执行
*)
(*代表所有其他值)中的程序。 - case 语句以
case
开头,以esac
结尾。 - 在每个分支程序之后要以
;;
(双分号)结尾,代表该程序段结束(千万不要忘记)。
案例1:模式匹配用户输入选择
在我们的脚本中经常有让用户输入Y/N表示是否确定执行接下来的操作,这个用if-else也可以做,但是当考虑到多个判断条件的时候if写出来的语句就显得过于繁杂,用case语句就可以简化
#!/bin/bash
read -p "Plead input a username: " username
id $username &>/dev/null
if [ "$?" -ne 0 ]; then
echo "$username: no such user"
exit 1
fi
read -p "Are you sure to delete $username?[Y/N] " choice
case "$choice" in
y|Y|yes|YES)
userdel "$username"
echo "$username is deleted!"
;;
*)
echo "Noting to do!"
;;
esac
#对比if的写法,判断条件十分的繁杂,稍有不慎就可能写错
#if [ -n "$choice" -a "$choice" = "y" -o "$choice" = "Y" -o "$choice" = "yes" -o "$choice" = "YES" ]; then
# userdel $username
# echo "$username id deleted!"
#else
# echo "error input"
# exit
#fi
案例二:实现一个简单的系统管理工具
执行脚本,首先打印支持的工具和代号,然后用户输入工具的代号执行功能。
#!/bin/bash
#定义个菜单
menu() {
printf "\t%s\t%s\n" "h." "help"
printf "\t%s\t%s\n" "f." "disk partition"
printf "\t%s\t%s\n" "d." "filesystem mount"
printf "\t%s\t%s\n" "m." "memory"
printf "\t%s\t%s\n" "u." "system load time"
printf "\t%s\t%s\n" "q." "exit"
}
#执行脚本首先打印菜单
menu
while :
do
read -p "Please input choice[h for help]: " choice
case $choice in
h)
clear
menu
;;
f)
fdisk -l
;;
d)
df -Th
;;
m)
free -m
;;
u)
uptime
;;
q)
echo "Bye!"
exit 0
;;
"")
;;
*)
echo "ERROR INPUT!"
;;
esac
done