case语句企业级生产案例
范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下。
1)命令用法为:
USAGE: sh adduser {-add|-del|-search} username
2)传参要求为:
参数为-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 ;; esacadd-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:关闭