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. 从西天取经的九九八十一难来看Java设计模式:模板方法模式

    目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...

  2. NumPy之:数据类型

    目录 简介 数组中的数据类型 类型转换 查看类型 数据溢出 简介 我们知道Python中有4种数字类型,分别是int,float,bool和complex.作为科学计算的NumPy,其数据类型更加的丰 ...

  3. JDBC_02_JDBC连接数据库 (INSERT INTO)

    JDBC连接数据库 (INSERT INTO) String url="jdbc:mysql://127.0.0.1:3306/employ?useUnicode=true&char ...

  4. 抛弃vuex ,拥抱ts,手撸泛型Store<T>!

    前段时间学习了下vue3 和ts ,就尝试下做了个项目,结果发现vuex和ts几乎无法结合,越写越别扭,开始怀疑用ts就是自己给自己挖坑,然后加了几个vue相关的群,去抱怨了几句,得到大佬指点:你可以 ...

  5. JPA简单的分页条件查询

    1,service层代码: @Override public QrCodeRecordPaging getPage(String projectId, Integer pageNumber, Inte ...

  6. windows下使用tail -f 命令查看实时日志

    经常在linux后台进行日志分析的同学对tail -f 这个命令肯定不陌生了,监控实时系统日志简直不要太方便.但是作为一个自动化测试工程师,我们的代码实际上在本地跑就够了,不需要部署,但是window ...

  7. 获取中断描述符表IDT的信息

    <pre name="code" class="cpp">//GetIDT.h文件 #ifndef _WIN32_WINNT // Allow us ...

  8. ART模式下基于dex2oat脱壳的原理分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78513483 一般情况下,Android Dex文件在加载到内存之前需要先对dex ...

  9. IPS入侵防御系统

    目录 IPS入侵防御系统 如何才能更好的防御入侵 IPS与IDS的区别 IDS与IPS的部署 IPS独立部署 IPS分布式部署 IPS入侵防御系统 IPS(Intrusion Prevention S ...

  10. 0803-PyTorch的Debug指南

    0803-PyTorch的Debug指南 目录 一.ipdb 介绍 二.ipdb 的使用 三.在 PyTorch 中 Debug 四. 通过PyTorch实现项目中容易遇到的问题 五.第八章总结 py ...