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. MySQL提升笔记(3)日志文件详解

    在MySQL数据库和InnoDB存储引擎中,有很多种文件,如:参数文件.日志文件.socket文件.pid文件.MySQL表结构文件.存储引擎文件. 本节重点关注日志文件,MySQL的复制.事务等重要 ...

  2. python进阶(7)--文件与异常

    一.文件读取二.文件写入三.异常四.存储数据 ---------------------------------------分割线:正文-------------------------------- ...

  3. Spring Security OAuth2 实现登录互踢

    背景说明 一个账号只能一处登录,类似的业务需求在现有后管类系统是非常常见的. 但在原有的 spring security oauth2 令牌方法流程(所谓的登录)无法满足类似的需求. 我们先来看 To ...

  4. 【CTF】CTFHub 技能树 文件头检查 writeup

    PHP一句话木马 <?php @eval($_POST["pass"]);?> <?php eval($_REQUEST["pass"]);? ...

  5. pandas(1):Pandas文件读取——read_excel()

    目录 一.函数原型 二.功能说明 三.常用参数说明 四.总结 一.函数原型 pd.read_excel(io, sheet_name=0, header=0, names=None, index_co ...

  6. 黑马 - poi Excel

    3.poi入门操作 3.1 搭建环境 1 <dependency> 2 <groupId>org.apache.poi</groupId> 3 <artifa ...

  7. Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统

    作者 王玉君,腾讯云后台高级开发工程师,负责腾讯云原生系统开发及建设. 晏子怡,腾讯云容器产品经理,在K8s弹性伸缩.资源管理领域有丰富的实战经验. 导语 Kubernetes 作为 IaaS 和 P ...

  8. C#通过rabbitmq实现定时任务(延时队列)

    本文主要讲解如何通过RabbitMQ实现定时任务(延时队列) 环境准备 需要在MQ中进行安装插件 地址链接 插件介绍地址:https://www.rabbitmq.com/blog/2015/04/1 ...

  9. 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式

    函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...

  10. Algorithm(4th) 1.5 union-find算法

    问题描述 问题输入是一对整数对,每个整数都代表一个对象,一对整数"p,q"表示 "p与q相连"(具有自反性,传递性,对称性,被归到一个等价类里),要求编写程序来 ...