shell脚本编程学习笔记-case语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本编程学习笔记-case语句相关的知识,希望对你有一定的参考价值。
1.case结构条件语句语法
case语句实际上就是规范的多分支if语句
case “字符串变量”in
值1)指令1…
;;
值2)指令2…
;;
*)指令3…
esac
中文编程语法:
case “找女朋友条件”in
有房)嫁给你…
;;
你爸是李刚)嫁给你…
;;
努力吃苦)可以考虑先谈朋友…
;;
*)good bye!!!
esac
2.简单case脚本
输入1、2、3分别输出对应的值
[[email protected] jiaobenlianxi]# cat case01.sh
#!/bin/bash
usage() {
echo "USAGE:$0 {1|2|3}" contents
exit 1
}
num() {
case "$1" in
1)echo "1"
;;
2)echo "2"
;;
3)echo "3"
;;
*)usage
esac
}
main() {
if [ $# -ne 1 ];then
usage
fi
num $1
}
main $*
3.执行脚本打印一个水果菜单如下:
a.apple
b.pear
c.banana
d.cherry
当用户选择水果的时候,打印告诉它选择的水果是什么并给选择的水果加上颜色。要求case语句实现。
[[email protected] jiaobenlianxi]# cat menufruit.sh
#!/bin/bash
RED_COLOR=‘\E[1;31m‘
GREEN_COLOR=‘\E[1;32m‘
YELLOW_COLOR=‘\E[1;33m‘
BLUE_COLOR=‘\E[1;34m‘
PINK=‘\E[1;35m‘
SHAN=‘\E[31;5m‘ 提示闪烁功能结合 echo –e 使用
RES=‘\E[0m‘
menu(){
cat <<EOF
1.[ apple ]
2.[ pear ]
3.[ bananan ]
4.[ cherry ]
5.exit
EOF
read -p "Please input a fruit:" fruit
}
usage(){
echo -e ${SHAN}"please select the exitnum behind"${RES}
echo "==========================================="
}
fruit(){
case "$fruit" in
1)echo -e "${RED_COLOR} apple $RES"
;;
2)echo -e "${GREEN_COLOR} pear $RES"
;;
3)echo -e "${YELLOW_COLOR} bananan $RES"
;;
4)echo -e "${BLUE_COLOR} cherry $RES"
;;
5)
exit
;;
*)usage
esac
}
main(){
while true
do
menu
fruit
done
}
Main
4.作业
已知nginx管理命令为:
启动:/usr/local/nginx/sbin/nginx
停止:/usr/local/nginx/sbin/nginx –s stop
重新加载:/usr/local/nginx/sbin/nginx –s reload
请用case脚本模拟nginx服务启动关闭:
/etc/init.d/nginx {start|stop|restart|reload}
并实现可通过chkconfig管理。
实战操作:
其实很简单,我们可以分四个模块第一个模块是启动服务模块,第二个模块是关闭服务模块,第三个模块是重启服务模块,第四个模块是平滑重启模块。先用函数分别实现这四个模块,在调用这些函数即可,最后就是设置开机自启,这就需要用chkconfig命令了。首先需要将我们写的启动脚本放到/etc/init.d/下面,然后在放到开机自启动下面。
我们先把启动脚本重命名,然后放到/etc/init.d/下面并给执行权限。
[[email protected] jiaobenlianxi]# cp nginx.sh nginx
[[email protected] jiaobenlianxi]# cp nginx /etc/init.d/
[[email protected] jiaobenlianxi]# chmod +x /etc/init.d/nginx
[[email protected] jiaobenlianxi]# ll /etc/init.d/nginx
-rwxr-xr-x. 1 root root 981 4月 2 04:16 /etc/init.d/nginx
添加开机自启动
在添加开机自启动之前我们需要知道服务的服务自启动一般在哪个运行级别。
以network为例,查看network服务开机启动运行级别
[[email protected] jiaobenlianxi]# chkconfig --list network
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
等级:
0:关机;
1:单用户模式;
2:多用户模式,没有NFS;
3:标准多用户模式;
4:不可用;
5:X11,图形界面模式;
6:重启。
上面是在命令行查看network的开机启动运行级别,下面我们在network启动脚本查看,network的开机自启动级别。
[[email protected] jiaobenlianxi]# head -5 /etc/init.d/network
#! /bin/bash
#
# network Bring up/down networking
#
# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \
我们看上面的chkconfig这一行,这个很重要它定义了开机的启动顺序默认都是2345,10代表的是服务开机启动顺序,90代表的是服务的关机启动顺序我们将chkconfig和description这一行 复制到/etc/init.d/下的nginx的启动脚本中。我们先去/etc/rc.d/rc3.d/里面找一下没有用到的开机启动顺序,我们看S20是没有的我们就将nginx的开机启动顺序设为20。关闭顺序同理也是一样的,这里就不演示了关机顺序以大写K开头,我们将nginx的关机顺序设为16。
[[email protected] logs]# ll /etc/rc.d/rc3.d/ |grep S19
lrwxrwxrwx. 1 root root 17 12月 30 04:10 S19rpcgssd -> ../init.d/rpcgssd
[[email protected]ellbiancheng logs]# ll /etc/rc.d/rc3.d/ |grep S20
脚本代码如下:
[[email protected] jiaobenlianxi]# cat nginx.sh
#!/bin/bash
# chkconfig: 2345 20 16
# description: nginx is a http server
#Date: 2018-04-07
#Author: Create by linzhongniao
#Mail: [email protected]
#Function:This scripts function is Nginx startup script.
#Version: 1.1
if [ -f /etc/init.d/functions ];then
. /etc/init.d/functions
fi
pidfile=/usr/local/nginx/logs/nginx.pid
SHAN=‘\E[31;5m‘
RES=‘\E[0m‘
nginx=/usr/local/nginx/sbin/nginx
RETVAL=0
linzhongniao() {
RETVAL=$?
if [ $RETVAL -eq 0 ];then
action "Nginx is $1" /bin/true
else
action "Nginx is $1" /bin/true
fi
}
start() {
if [ -f $pidfile ];then
echo -e ${SHAN}"nginx is running"${RES}
else
$nginx
linzhongniao started
fi
return $RETVAL
}
stop() {
if [ ! -f $pidfile ];then
echo -e ${SHAN}"nginx is stopped"${RES}
else
$nginx -s stop
linzhongniao stopped
fi
return $RETVAL
}
restart() {
printf "Restarting Nginx ...\n"
stop
sleep 2
start
}
reload() {
if [ ! -f $pidfile ];then
echo -e ${SHAN}"Can‘t open $pidfile,no such file or directory"${RES}
else
$nginx -s reload
linzhongniao reload
fi
return $RETVAL
}
usage() {
echo -e ${SHAN}"USAGE:$0 {start|stop|restart|reload}"${RES}
}
main() {
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
*)usage
exit $RETVAL
esac
}
main $1
exit $RETVAL
最后我们把它加载到chkconfig里面,完成nginx服务开机自启动
[[email protected] init.d]# chkconfig nginx on
[[email protected] init.d]# chkconfig --list nginx
nginx 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
关闭开机自启动
[[email protected] init.d]# chkconfig nginx off
[[email protected] init.d]# chkconfig --list nginx
nginx 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
5.case语句小结
(1)case语句相当于多分支的if语句。case语句优势更规范、易读。
(2)case语句适合变量值少,并且固定的数字或字符串的集合。(1,2,3)或(start,stop,restart)。
(3)系统服务启动脚本传参多使用case语句,参考/etc/init.d/rsyslog的启动脚本。
(4)所有case语句都可以使用if实现,但是case语句更规范清晰一些。
(5)case语句一般适合于服务的启动脚本。
(6)case的变量的值如果已知固定的start/restart/stop的元素比较适合。
语句小结:
(1)case主要是写启动脚本,范围较窄。
(2)if取值判断、比较、应用广泛。
6.学习系统脚本
多向系统脚本学习
/etc/init.d/functions
函数库functions详解:http://www.cnblogs.com/image-eye/archive/2011/10/26/2220405.html
/etc/rc.d/rc.sysinit
/etc/init.d/rpcbind
/etc/init.d/nfs
/etc/init.d/httpd
以上是关于shell脚本编程学习笔记-case语句的主要内容,如果未能解决你的问题,请参考以下文章