case語句
case結(jié)構(gòu)條件句相當(dāng)于多分支的if/elif/else條件句,但是它比這些條件句看起來更規(guī)范公正,常被用于實(shí)現(xiàn)系統(tǒng)服務(wù)啟動(dòng)腳本等企業(yè)應(yīng)用場景中。
在case語句中,程序會(huì)將case獲取的變量的值與表達(dá)式部分的值1主胧、值2、值3等逐個(gè)進(jìn)行比較习勤,如果獲取的變量值與某個(gè)值(例如值1)匹配踪栋,就會(huì)執(zhí)行值(例如值1)的后面對(duì)應(yīng)的指令(例如指令1,可能是一組指令)姻报,直到執(zhí)行到雙分號(hào)(;;)才停止己英,然后跳出case語句主體,執(zhí)行case語句(即esac字符)后面的其他命令
如果沒有找到匹配變量的任何值吴旋,則執(zhí)行*)后面的指令(通常是給使用者的使用提示)损肛,直到遇到雙分號(hào)(;;)或者esac結(jié)束厢破,這部分相當(dāng)于if多分支中最后的else語句部分。另外治拿,case語句中的表達(dá)式對(duì)應(yīng)值的部分摩泪,可以使用管道及通配符等更多功能匹配
1、 case語法
case結(jié)構(gòu)條件句的語法格式為:
case “變量” in
值1)
指令1...
;;
值2)
指令2...
;;
*)
指令3...
esac
如果case語句以中文形式描述劫谅,那么就是以下情況:
case “老男孩的各位” in
找到好工作)
給父母買買買
;;
天上掉金子)
給自己買買買
;;
天上掉女朋友)
給女朋友買買買
*)
還是老老實(shí)實(shí)學(xué)習(xí)吧<印!
esac
2捏检、case結(jié)構(gòu)語句的流程圖如下所示:
3荞驴、 案例實(shí)操
3.1 編寫腳本。使用單個(gè)字符進(jìn)行傳參贯城,使用case判斷是數(shù)字還是字母(使用正則)
[root@shell-project /server/scripts]# cat case-home01.sh
#!/bin/bash
# 使用單個(gè)字符進(jìn)行傳參熊楼,使用case判斷是數(shù)字還是字母(使用正則)
read -p "請(qǐng)輸入單個(gè)字符: " n
case "$n" in
[a-zA-Z])
echo "$n 是字母."
;;
[0-9])
echo "$n 是數(shù)字."
;;
*)
echo "其他"
esac
[root@shell-project /server/scripts]#
3.2 將” 打印菜單,按照選擇項(xiàng)一鍵安裝不同的web服務(wù)”腳本,將其中的條件表達(dá)式修改成case或if語句
[root@shell-project /server/scripts]# vim case-home02.sh
1 #!/bin/bash
8 # 將” 打印菜單能犯,按照選擇項(xiàng)一鍵安裝不同的web服務(wù)”腳本,將其中的條件表達(dá)式修改成case或if語句
9
10 #定義變量
11 lamp="/server/scripts/lamp.sh"
12 lnmp="/server/scripts/lnmp.sh"
13
14 #打印菜單
15 cat << EOF
16 1.[install lamp]
17 2.[install lnmp]
18 3.[exit]
19 EOF
20
21 #使用read讀取輸入
22 read -p 'please input the num you want: ' num
23 #定義函數(shù)
24 function lamp_lanp(){
25 if [ -f "$1" ];then
26 if [ ! -x "$1" ];then
27 echo "$1 沒有執(zhí)行權(quán)限,不可執(zhí)行"
28 exit 2
29 else
30 $1
31 fi
32 else
33 echo "error: $1 is not exist."
34 exit 3
35 fi
36 }
37
38 case "$num" in
39 "1")
40 echo 'start installing lamp……'
41 lamp_lanp $lamp
42 ;;
43 "2")
44 echo 'start installing lnmp……'
45 lamp_lanp $lnmp
46 ;;
47 "3")
48 echo 'good byb!'
49 ;;
50 *)
51 echo 'Input Error'
52 exit 5
53 esac
3.3 將Nginx服務(wù)管理腳本改為case方式+函數(shù)方式鲫骗,并通過systemctl進(jìn)行控制啟動(dòng)停止
[root@shelledu ~]# cat /etc/init.d/nginxd_case
#!/bin/bash
#定義函數(shù)
function stat_check(){
count=`netstat -lntup|grep nginx|wc -l`
}
function nginx_start(){
stat_check
if [ $count -gt 0 ];then
echo 'nginx已經(jīng)處于啟動(dòng)狀態(tài)'
else
/application/nginx/sbin/nginx
echo 'nginx啟動(dòng)成功'
fi
}
function nginx_stop(){
stat_check
if [ $count -eq 0 ];then
echo 'nginx已經(jīng)處于關(guān)閉狀態(tài)'
else
/application/nginx/sbin/nginx -s stop
echo 'nginx已關(guān)閉'
fi
}
# 如果參數(shù)是start,則執(zhí)行start的啟動(dòng)方式(/application/nginx/sbin/nginx)
case "$1" in
"start")
nginx_start
;;
"stop")
nginx_stop
;;
"restart")
nginx_stop
sleep 2
nginx_start
;;
*)
echo '參數(shù)錯(cuò)誤踩晶,正確的參數(shù)是{start|stop|restart}'
esac
[root@shelledu ~]#
3.4 使用case選擇水果执泰,并打印水果名及其顏色
1.apple
2.pear
3.banana
4.blueberry
其中,顏色表達(dá)式分別為
31m 紅色
32m 綠色
33m 黃色
34m 藍(lán)色
使用方式為
[root@oldboy-node101 ~]# echo -e "\E[1;31m我是紅色 \E[0m"
我是紅色
[root@oldboy-node101 ~]# echo -e "\E[1;32m我是綠色 \E[0m"
我是綠色
[root@oldboy-node101 ~]# echo -e "\E[1;33m我是黃色 \E[0m"
我是黃色
[root@oldboy-node101 ~]# echo -e "\E[1;34m我是藍(lán)色 \E[0m"
我是藍(lán)色
分析:
1)打印菜單
2)使用read渡蜻,顯示一句話“選擇你喜歡的水果”
3)使用case判斷數(shù)字是【1|2|3|4】
4)如果都不符合术吝,報(bào)錯(cuò)退出
[root@shell-project /server/scripts]# cat case-home02.sh
#!/bin/bash
# 使用case選擇水果,并打印水果名及其顏色
#定義函數(shù)
function colors(){
echo -e "your like \E[1;${1}m${2} \E[0m"
}
#打印菜單
cat <<EOF
1.apple
2.pear
3.banana
4.blueberry
EOF
read -p "選擇你喜歡的水果: " num
case "$num" in
"1")
colors '31' 'apple'
;;
"2")
colors '32' 'pear'
;;
"3")
colors '33' 'banana'
;;
"4")
colors '34' 'blueberry'
;;
*)
echo '抱歉茸苇,沒有你喜歡的水果顿苇!'
esac
[root@shell-project /server/scripts]#
[root@shell-project /server/scripts]# sh case-home02.sh
1.apple
2.pear
3.banana
4.blueberry
選擇你喜歡的水果: 1
your like apple
[root@shell-project /server/scripts]#