一 、多分支if语句
由于if 语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。
if 条件测试操作 1
then
命令序列 1
elif 条件测试操作 2
then
命令序列 2
else
命令序列 3
fi
二、case分支语句
case 变量值 in
模式1)
命令序列 1
;;
模式2)
命令序列 2
;;
......
*) # ”*“代表任意
默认命令序列
esac
……
-
case 语句的执行流程如下:
首先使用"变量值"与模式1进行比较,若取得相同则执行模式1后的命令序列,直到遇到双分号";;“后调至esac,表示结束分支
② 若与模式1不匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇到双分号”;;“后调至esac,表示结束分支
③ 后面的以此类推…
④ 若找不到任何匹配的值,则执行默认模式”*)"后的命令序列,直到遇到esac后结束分支
使用 case 分支语句时,有几个值得注意的特点如下所述:
case 行尾必须为单词“in”,每一模式必须以右括号“)”结束
双分号“;;”表示命令序列的结束
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如“A|B”
最后的“*)”表示默认模式,其中的 *相当于通配符.
三、实操
3.1 系统控制服务脚本,控制服务的启动、重启、停止。
建立vim ww.sh
3.2 根据学生的成绩,判断优秀、良好、和不及格几个等级。
[root@localhost ~]# vim cj.sh
3.3 删除家目录
vim.fw..shi
3.4 剪刀石头布 电脑与人
#!bin/bash
game=(石头 剪刀 布)
num=$[RANDOM%3]
computer=${game[$num]}
#通过随机数获取计算机的出拳
#出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是3中不同的可能
echo "请根据下列提示选择您的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read -p "请选择1-3:" person
#提示用户出拳,根据提示出拳即可
#再通过case语句判断用户输入的值是1还是2还是3,根据不同的输入判断不同的结果
case $person in
1)
if [ $num -eq 0 ]; then
echo "平局"
elif [ $num -eq 1 ]; then
echo "你赢"
else
echo "计算机赢"
fi ;;
2)
if [ $num -eq 0 ]; then
echo "计算机赢"
elif [ $num -eq 1 ]; then
echo "平局"
else
echo "你赢"
fi ;;
3)
if [ $num -eq 0 ]; then
echo "你赢"
elif [ $num -eq 1 ]; then
echo "计算机赢"
else
echo "平局"
fi ;;
*)
echo "必须输入1-3的数字"
esac
3.5 case 语句的应用
[root@localhost /home]#vim test5.sh
#!/bin/bash
case $1 in
start)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux |grep httpd
echo "httpd start"
;;
stop)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux |grep httpd
echo "httpd stop"
;;
restart)
echo "正在关闭 httpd 服务......"
/usr/bin/ps aux |grep httpd
/usr/bin/systemctl $1 httpd
echo "httpd 服务正在重新启动中......"
/usr/bin/ps aux |grep httpd
;;
status)
/usr/bin/systemctl $1 httpd
;;
*)
echo "please input start|stop|restart|status"
esac
:wq保存并退出
[root@localhost /home]#yum install -y httpd
[root@localhost /home]#bash test5.sh #除了设置的三个参数以外所有都会指向下面的输出结果
please input start|stop|restart|status
[root@localhost /home]#bash test5.sh start #启动httpd服务
root 12252 0.0 0.1 221944 4972 ? Ss 01:30 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12259 0.0 0.0 224028 3092 ? S 01:30 0:00 /usr/sbin/httpd -DFOREGROUND
root 12260 0.0 0.0 112676 960 pts/0 S+ 01:30 0:00 grep httpd
apache 12261 0.0 0.0 224028 3092 ? S 01:30 0:00 /usr/sbin/httpd -DFOREGROUND
httpd start
[root@localhost /home]#netstat -antulp |grep httpd
tcp6 0 0 :::80 :::* LISTEN 12252/httpd
[root@localhost /home]#bash test5.sh stop #关闭httpd服务
root 12306 0.0 0.0 112676 960 pts/0 S+ 01:31 0:00 grep httpd
httpd stop
[root@localhost /home]#bash test5.sh restart #重启httpd服务
正在关闭 httpd 服务......
root 12344 0.0 0.1 221944 4968 ? Ss 01:32 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12347 0.0 0.0 224028 3088 ? S 01:32 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12351 0.0 0.0 224028 3088 ? S 01:32 0:00 /usr/sbin/httpd -DFOREGROUND
root 12367 0.0 0.0 112676 956 pts/0 S+ 01:34 0:00 grep httpd
httpd 服务正在重新启动中......
root 12381 0.0 0.1 221944 4972 ? Ss 01:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12382 0.0 0.0 224028 3092 ? S 01:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12386 0.0 0.0 224028 3092 ? S 01:34 0:00 /usr/sbin/httpd -DFOREGROUND
root 12388 0.0 0.0 112676 956 pts/0 S+ 01:34 0:00 grep httpd
[root@localhost /home]#bash test5.sh status #查看httpd服务状态
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2021-09-06 01:34:15 CST; 4min 51s ago
Docs: man:httpd(8)
man:apachectl(8)
......
以下内容省略
四、总结
在Linux 系统中,/etc/rc.d/init.d 目录下绝大多数的系统服务脚本使用了 case 分支语句,平时控制各种系统服务时,提供的 start、stop、restart等位置参数,正是由 case 语句结构来识别并完成相应操作的!