微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第9章 case条件语句的应用实践

case语句企业级生产案例

范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下。

  1)命令用法为:

  USAGE: sh adduser {-add|-del|-search} username

  2)传参要求为:

  参数为-add,表示添加后面接的用户名

  参数为-del,表示删除后面接的用户名

  参数为-search,表示查找后面接的用户名

  3)如果有同名的用户,则不能添加,如果没有对应的用户,则无需删除,查找到用户或没有用户时应给出明确提示

  4)/etc/openvpn_authfile.conf不能被所有外部用户直接删除修改

#!/bin/sh
#create by lewen
#Source function library.
. /etc/init.d/functions
#config file path
FILE_PATH=/etc/openvpn_authfile.conf       #<==这是openvpn的登录授权文件路径。
[ ! -f $FILE_PATH ] && touch $FILE_PATH       #<==如果变量对应的文件不存在,则创建文件。
usage(){                                   #<==帮助函数。#<==这是一个可以替代echo的输出菜单内容方法。
    cat <<EOF
    USAGE: `basename $0` {-add|-del|-search} username
EOF
}
#judge run user
if [ $UID -ne 0 ] ;then       #<==必须是root用户,才能执行本脚本。
    echo "Youare not supper user,please call root!"
    exit 1;
fi
#judge arg numbers.
if [ $# -ne 2 ] ;then       #<==传入的参数必须为两个。
    usage
    exit 2
fi

#满足条件后进入case语句判断。
case "$1" in              #<==获取命令行第一个参数的值。
    -a|-add)
        shift                                                #<==将$1清除,将$2替换为$1,位置参数左移。
        if grep "^$1$" ${FILE_PATH} >/dev/null 2>&1       #<==过滤命令行第一个参数的值,如果有
          then
            action $"vpnuser,$1 is exist" /bin/false
            exit
        else                                                        #<==如果文件中不存在命令行传参的一个值,则执行下面的指令。
            chattr -i ${FILE_PATH}                                      #<==解锁文件。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)                     #<==备份文件(尾部加时间)。

            echo "$1" >> ${FILE_PATH}                            #<==将第一个参数(即用户名)加入到文件。
            [ $ -eq 0 ] && action $"Add $1" /bin/true            #<==如果返回值为0,提示成功。

            chattr +i ${FILE_PATH}       #<==给文件加锁。
        fi
        ;;
    -d|-del)
        shift
        if [ `grep "\b$1\b" ${FILE_PATH}|wc -l` -lt 1 ]       #<==过滤第一个参数值,  并看文件中是否存在。
          then                                                  #<==如果不存在,则执行下面的指令。
            action $"vpnuser,$1 is not exist." /bin/false
            exit
        else                                    #<==否则执行下面的指令,存在才删除
            chattr -i ${FILE_PATH}              #<==给文件解锁,准备处理文件内容。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)         #<==备份文件(尾部加时间)。

            sed -i "/^${1}$/d" ${FILE_PATH}                     #<==删除文件中包含命令行传参的用户。
            [ $? -eq 0 ] && action $"Del $1" /bin/true           #<==如果返回值为0,提示成功。

            chattr +i ${FILE_PATH}              #<==给文件加锁。
            exit
        fi
        ;;
    -s|-search)
        shift
        if [ `grep -w "$1" ${FILE_PATH}|wc -l` -lt 1 ]      #<==过滤第一个参数值,并看文件中是否存在。
          then
            echo $"vpnuser,$1 is not exist.";exit
        else
            echo $"vpnuser,$1 is exist.";exit
        fi
        ;;
    *)
        usage
        exit
        ;;
esac
add-openvpn-user

grep精确过滤单词的三种方法

[root@lewen scripts]# grep -w "lewen" /etc/openvpn_authfile.conf

lewen

[root@lewen scripts]# grep "\blewen\b" /etc/openvpn_authfile.conf

lewen

[root@lewen scripts]# grep "^lewen$" /etc/openvpn_authfile.conf

lewen

范例9-8:已知Nginx Web服务的管理命令如下,

  启动服务命令为/application/Nginx/sbin/Nginx

  停止服务命令为/application/Nginx/sbin/Nginx-s stop

  请用case语句开发脚本,以实现Nginx服务启动及关闭功能,具体脚本命令为

  /etc/init.d/Nginxd{start|stop|restart},并实现通过chkconfig进行开机自启动的管理。

  环境准备提示

  如果读者对Nginx环境还不是很熟悉,那么请参考《跟老男孩学Linux运维:Web集群实战》第5章的内容

  解题思路:

  1)先判断Nginx的PID文件是否存在(Nginx服务正常启动后PID文件就会存在),如果不存在,即表示Nginx没有运行,则运行Nginx服务的启动命令(可以把此部分写成start函数)。待要停止时,如果PID存在,就运行Nginx服务停止命令,否则就不运行停止命令(可以把此部分写成stop函数)。

  2)通过脚本传入参数start或stop等,通过case语句获取参数进行判断。

  3)为了看起来更专业,这里采用前文讲解的系统函数库functions中的action函数

  4)对函数及命令运行的返回值进行处理,使脚本看起来更专业、规范。

  5)通过chkconfig来管理Nginx脚本,实现开机自启动。

chmod +x /etc/init.d/Nginxd

#!/bin/sh
# chkconfig: 2345 40 98                     #<==设定2345级别,开机第40位启动脚本, 关机第98位关闭脚本。

# description: Start/Stop Nginx server       #<==描述信息。
path=/application/Nginx/sbin                #<==设定Nginx启动命令路径。
pid=/application/Nginx/logs/Nginx.pid       #<==设定Nginx PID文件路径。
RETVAL=0                                   #<==设定RETVAL为0,作为返回值变量。
. /etc/init.d/functions                     #<==加载系统函数库,目的是便于后面使用 action等重要函数。

start(){                                   #<==定义start启动函数。
    if [ ! -f $pid ];then                     #<==如果PID文件不存在,则执行命令。
    #if [ `netstat -lntup|grep Nginx|wc -l` -eq 0 ];then#<==也可以根据端口进行判断。
        $path/Nginx                               #<==启动Nignx命令。
        RETVAL=$?                            #<==获取启动Nignx命令后的状态返回值。
        if [ $RETVAL -eq 0 ];then       #<==如果返回值为0,则执行下面的指令。
            action "Nginx is started" /bin/true #<==打印专业的启动提示。
             return $RETVAL              #<==retrun将返回值,返回给命令脚本。
        else
            action "Nginx is started" /bin/false #<==如果返回值不为0,则打印启动失败的专业提示。
            return $RETVAL              #<==retrun将返回值,返回给命令脚本。
        fi                                   #<==状态返回值判断if语句结束。
    else
        echo "Nginx is running"              #<==如果存在Nginx PID文件,则输出Nginx 正在运行的提示。
        return 0                            #<==retrun将返回值,返回给命令脚本。
    fi
}
stop(){    #<==定义start启动函数,这部分内容和start函数几乎一样,因此不再进行详细 注释,读者可参考start部分,看能否自行注释。

    if [ -f $pid ];then
    #if [ `netstat -lntup|grep Nginx|wc -l` -eq 0 ];then
        $path/Nginx -s stop
        RETVAL=$?
        if [ $RETVAL -eq 0 ];then
            action "Nginx is stopped" /bin/true
            return $RETVAL
        else
            action "Nginx is stopped" /bin/false
            return $RETVAL
        fi
    else
        echo "Nginx is no running"
        return $RETVAL
    fi
}
case "$1" in              #<==通过特殊参数$1接收脚本传参的字符串(start|stop|restart)。
    start)                     #<==如果$1接收的脚本传参的值为start,则执行start函数。
        start              #<==执行start函数。
        RETVAL=$?              #<==获取start函数执行后的返回值。
        ;;
    stop)
        stop
        RETVAL=$?              #<==获取stop函数执行后的返回值。
        ;;
    restart)
        stop
        sleep 1
        start
        RETVAL=$?              #<==获取函数执行后的返回值。
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac
exit $RETVAL                  #<==将脚本的返回值返回到执行脚本的当前Shell。
cat /etc/init.d/Nginxd
[root@oldboy scripts]# chkconfig --add Nginxd
[root@oldboy scripts]# chkconfig --list Nginxd
Nginxd          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐