1.case结构条件语句语法

case语句实际上就是规范的多分支if语句,字符串变量的值可以是多个用“|”管道符号分隔;注意最后一个变量值的格式,变量值和“;;”两个分号是一对,要时刻保持这种格式的完整性即使在最后一个变量的取值。

case “字符串变量”in

   值1)
       指令1…
       ;;
   值2|值3|值4)
       指令2…
       ;;
  *)
       指令3…
       ;;    
esac

中文编程语法:

case “找女朋友条件”in

   有房)
       嫁给你…
       ;;
   你爸是李刚)
       嫁给你…
   ;; 
   努力|肯吃苦|长得帅)
       可以考虑先谈朋友…
       ;;    
     *)
       good bye!!!
       ;;
esac

2.简单case脚本

输入1、2、3分别输出对应的值

[root@shellbiancheng 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语句实现。

[root@shellbiancheng 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 <

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/下面,然后在放到开机自启动下面。

(1)先把启动脚本重命名,然后放到/etc/init.d/下面并给执行权限。

[root@shellbiancheng jiaobenlianxi]# cp nginx.sh nginx
[root@shellbiancheng jiaobenlianxi]# cp nginx /etc/init.d/
[root@shellbiancheng jiaobenlianxi]# chmod +x /etc/init.d/nginx 
[root@shellbiancheng jiaobenlianxi]# ll /etc/init.d/nginx 
 -rwxr-xr-x. 1 root root 981 4月   2 04:16 /etc/init.d/nginx

(2)添加开机自启动

在添加开机自启动之前我们需要知道服务的服务自启动一般在哪个运行级别。以network为例,查看network服务开机启动运行级别。

[root@shellbiancheng jiaobenlianxi]# chkconfig --list network
network    0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

运行级别:

0:关机;

1:单用户模式;

2:多用户模式,没有NFS;

3:标准多用户模式;

4:不可用;

5:X11,图形界面模式;

6:重启。

上面是在命令行查看network的开机启动运行级别,下面我们在network启动脚本查看,network的开机自启动级别。

[root@shellbiancheng 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。

[root@shellbiancheng logs]# ll /etc/rc.d/rc3.d/ |grep S19
lrwxrwxrwx. 1 root root 17 12月 30 04:10 S19rpcgssd -> ../init.d/rpcgssd
[root@shellbiancheng logs]# ll /etc/rc.d/rc3.d/ |grep S20

(3)脚本代码如下:

[root@shellbiancheng 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服务开机自启动,设置在指定启动级别上启动用chkconfig --level

[root@shellbiancheng ~]# chkconfig --add /etc/init.d/nginx
[root@shellbiancheng init.d]# chkconfig nginx on
[root@shellbiancheng init.d]# chkconfig --list nginx
nginx      0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
关闭开机自启动
[root@shellbiancheng init.d]# chkconfig nginx off
[root@shellbiancheng init.d]# chkconfig --list nginx
nginx      0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:关闭    6:关闭

(4)总结:

1、自己开发脚本实现开机自启的动流程就是开发脚本、将开发的脚本放到/etc/init.d/目录下、添加开机自启动管理。

2、流程中最重要的就是开发脚本,一定要注意自己开发的脚本中的chkconfig: 2345 20 16这一行。

3、将脚本放到/etc/init.d/目录下,要给脚本可执行权限。

4、注意自己写的脚本要用--add参数添加到系统服务。

5.case语句小结

(1)case语句相当于多分支的if语句,case语句优势更规范、易读。

(2)系统服务启动脚本传参多使用case语句,参考/etc/init.d/rsyslog的启动脚本。

(3)所有case语句都可以使用if实现,但是case语句更规范清晰一些。

(4)case语句一般适合于服务的启动脚本,范围较窄;if取值判断、比较广发应用。

(5)case的变量的值如果是已知固定的,用start/restart/stop的元素比较适合。

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