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:关闭

第9章 case条件语句的应用实践的更多相关文章

  1. 『忘了再学』Shell流程控制 — 35、多分支case条件语句

    目录 1.case条件语句介绍 2.case语句需要注意的内容 3.练习 示例1 示例2 1.case条件语句介绍 case语句和if-elif-else语句一样都是多分支条件语句,不过和if多分支条 ...

  2. 关于Switch case条件语句中无break的用法

    关于Switch case条件语句的另类用法       今天在拜读一位前辈的程序时,遇到了这样一段程序: /***************************/ switch(operation ...

  3. JavaScript case 条件语句

    JavaScript case 条件语句 示例 switch(name){ case '1': age = 123; break; case '2' age = 456; break; default ...

  4. shell脚本中的case条件语句介绍和使用案例

    #前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句.case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,ca ...

  5. asp.net select Case条件语句的使用方法

    原文:http://www.111cn.net/net/vb-net/38548.htm 如果 testexpression 与任何 Case expressionlist 表达式匹配 ,则执行此 C ...

  6. Linux Shell脚本编程case条件语句

    1,判断一个数字是否则在1,2,3之中. #!/bin/bash read -p "pls input a number:" n case "$n" in ) ...

  7. 第四章:条件语句(if)和循环结构(while)

    1.流程控制 含义与作用 Python程序执行,一定按照某种规律在执行 a.宏观一定是自上而下(逻辑上方代码一定比逻辑下方代码先执行):顺序结构b.遇到需要条件判断选择不同执行路线的执行方式:分支结构 ...

  8. 11月26日 用seed,预加载种子文件; Case 条件语句。网址的参数如何传递,; Query--自定义scopes

    在seed文件中输入一些预加载的种子job,注意属性和值都要有:  ❌错误,我输入contact_email的时候value值是空的,这样不能正确生成. 正确✅: for i in 1..10 do ...

  9. Shell编程之case条件

    一.case条件语句 1.语法 case "变量" in 值 1) 指令 1... ;; 值 2) 指令 2... ;; *) 指令 3... esac case条件语句的执行流程 ...

随机推荐

  1. 6.3string用法

    string类型可以大大方便对字符串的处理 1.string的定义 string str; string str="abcd"; 2.string中内容的访问 (1)可以像字符数组 ...

  2. php的类

    类成员中:属性.类常量和方法都可以无限定义,但是定义的原则是相关性.除了以上三个类成员,不能在类结构{}中直接写其他任何代码 PHP类结构中有三种成员:属性.方法和类常量 类结构中只能有三种成员,不限 ...

  3. Android+Spring Boot 选择+上传+下载文件

    2021.02.03更新 1 概述 前端Android,上传与下载文件,使用OkHttp处理请求,后端使用Spring Boot,处理Android发送来的上传与下载请求.这个其实不难,就是特别多奇奇 ...

  4. kubernetes-copyFromPod

    import com.google.common.io.ByteStreams; import io.kubernetes.client.Copy; import io.kubernetes.clie ...

  5. Day14_76_反射与静态语句块

    反射与静态语句块 * 获取class对象与静态语句块的关系 package com.shige.Reflect; import java.nio.channels.ClosedSelectorExce ...

  6. dot 语法总结

    在使用pprof分析go的项目时,经常会查看各项指标的有向图 原理是使用Graphviz(Graph Visualization Software)解析生成的dot脚本得到最终展示给我们的图信息. d ...

  7. 【Nacos】Springboot整合nacos配置中心(一)

    一.本地Nacos安装环境: Win7 ,JDK8 ,maven3.5 1.下载安装包 2.启动nacos服务,bin文件下下面startup.cmd 3.访问 http://localhost:88 ...

  8. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  9. Windows 签名伪造工具的使用,Python,签名

    #!/usr/bin/env python3 # LICENSE: BSD-3 # Copyright: Josh Pitts @midnite_runr import sys import stru ...

  10. Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章!

    Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章! 转载 原文章地址:点击 2014-01-09 Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章! ...