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