shell case语句
case语句简介
case语句主要用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列
case语句匹配一个值与一个模式,如果匹配成功则执行所匹配的命令序列
case语句的语法结构
case expression in #expression代表一个变量,他的取值可以变量,也可以是特定的值,后面必须是in
pattern1) #匹配的第一个模式,模式必须以")"结束
statement1 #匹配成功后执行的命令序列
;; #必须有,代表命令序列的结束
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*) #如果以上的模式都没有匹配成功,则匹配默认的模式
statementn #匹配默认模式后执行的命令序列
esac
case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式
expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。
case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:
case语句执行流程
如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分
Shell case in 语句中的*)用来“托底”,万一 expression 没有匹配到任何一个模式,*)部分可以做一些“善后”工作,或者给用户一些提示。
可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。
除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。
实例1
[root@yaoguang ~]# vim hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "你输入的是字母 $KEY"
;;
[0-9])
echo "你输入的是数字 $KEY"
;;
*)
echo "你输入的是非法字符 $KEY"
esac
[root@yaoguang ~]# sh hitkey.sh
请输入一个字符,并按Enter键确认:1
你输入的是数字 1
[root@yaoguang ~]# sh hitkey.sh
请输入一个字符,并按Enter键确认:w
你输入的是字母 w
[root@yaoguang ~]# sh hitkey.sh
请输入一个字符,并按Enter键确认:@
你输入的是非法字符 @
实例2 交互式例子
[root@yaoguang]# cat jiaohu.sh
#!/bin/bash
while true
do
echo -e "
\033[31m A 显示主机IP \033[0m
\033[32m B 显示磁盘剩余空间 \033[0m
\033[33m C 显示系统运行时间 \033[0m
\033[34m Q 退出系统 \033[0m
"
read -p "请输入你的选择:" char
case $char in
a|A)
ifconfig eth0 | grep "inet " | awk '{print $2}'
;;
b|B)
df -h | awk 'NR==2{print "剩余空间大小为:"$4}'
;;
c|C)
uptime |awk '{print $3}' | awk -F, '{print $1}' | awk -F: '{print "系统已经运行了"$1"小时"$2"分钟"}'
;;
q|Q)
exit 0
;;
esac
done