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. 期末考试复习c#时总结的抽象类与接口的一些区别

    抽象类: (1)抽象类中可以定义抽象方法,属性,变量 (2)抽象类的派生类必须实现所有的抽象方法.要求所有的派生非抽象类都要用override重写实现抽象方法. (3)抽象类可以存放抽象方法,属性,也 ...

  2. 火狐兼容selenium版本解决

    火狐和selenium不是很好兼容,下面提供一些我所知道的可以兼容的版本: 1. 火狐52+selenium 3.3 +geckodriver v0.15.0 2.火狐59+selenium 3.11 ...

  3. Java多线程编程(同步、死锁、生产消费者问题)

    Java多线程编程(同步.死锁.生产消费): 关于线程同步以及死锁问题: 线程同步概念:是指若干个线程对象并行进行资源的访问时实现的资源处理保护操作: 线程死锁概念:是指两个线程都在等待对方先完成,造 ...

  4. 002-Java的标识符和关键字

    目录 一.标识符 1.什么是标识符 2.标识符的命名规则 3.标识符的命名规范 二.关键字 1.什么是关键字 2.Java中的关键字 一.标识符 1.什么是标识符   标识符就是程序员自己规定的代表一 ...

  5. Molar mass UVA - 1586

    ​ An organic compound is any member of a large class of chemical compounds whose molecules contain c ...

  6. 如何解压从UK biobank下载下来的tsv.bgz文件?

    今天碰到一个问题,就是从UK biobank下载下来的gwas result file是filename.tsv.bgz格式.这东西需要解压才能阅历,可是用zip或者rar都是搞不定,网上搜了一圈,说 ...

  7. k8s新手必看

    转载自https://juejin.im/post/6844903840139968520 Kubernetes零基础快速入门!初学者必看! 起源 Kubernetes 源自于 google 内部的服 ...

  8. 2020北航OO第二单元总结

    2020北航OO第二单元总结 前言 本单元考察基于多线程的电梯调度问题,成功让我从一个多线程小白到了基本掌握了使用锁来控制线程安全的能力,收获颇多(充分体验了迷茫地de一个又一个死锁bug的痛苦). ...

  9. I - 树的直径 POJ - 1383

    The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is d ...

  10. Fastjson反序列化漏洞复现

    Fastjson反序列化漏洞复现 0x00 前言 对Fastjson反序列化漏洞进行复现. 0x01 漏洞环境 靶机环境:vulhub-fastjson-1.2.24 ip:172.16.10.18 ...