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语句的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之case语句与循环语句

shell编程之函数和case多条件分支语句

Shell编程Shell中多分支case条件语句

shell脚本结构化命令笔记

Shell脚本之forwhile循环语句和case分支语句

shell脚本的学习和使用