case 条件语句的应用实践
文章目录
- case 条件语句的应用实践
- 1 case 条件语句的语法
- 2 case 条件语句实践
- 3 实践:给输出的字符串加颜色
- 4 case 语句企业级生产案例
- 示例1:控制sshd服务
- 示例2:管理用户
- 5 case 条件语句的 Linux 系统脚本范例
- 6 本章小结
case 条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。
在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较:
- 如果获取的变量值和某个值(例如值1)相匹配,就会执行值(例如值1)后面对应的指令(例如指令1,其可能是一组指令),直到执行到双分号(;;)才停止,然后再跳出case语句主体,执行case语句(即esac字符)后面的其他命令。
- 如果没有找到匹配变量的任何值,则执行“*)”后面的指令(通常是给使用者的使用提示),直到遇到双分号(此处的双分号可以省略)或esac结束,这部分相当于if多分支语句中最后的else语句部分。
- 另外,case语句中表达式对应值的部分,还可以使用管道等更多功能来匹配。
1 case 条件语句的语法
case 条件语句的语法格式为:
case"变量值"in值1)指令1...;;值2)指令2...;;*)指令3...;;esac为了便于大家记忆,下面是某女生写的case 条件语句的中文形象描述:
case"找老公条件"in资产大于1千万) 嫁给你;;资产介于1百万和1千万之间) 再考虑以下;;资产小于1百万) 再见;;其他情况) 视情况而定;;esaccase 条件语句的执行流程逻辑图如下:
2 case 条件语句实践
示例:判断用户输入的数字是否是1、2、3。
[laoma@shell ~]$catcase1.sh#!/bin/bashread-p"请输入一个1-3之间数字:"numcase$numin1)echo"您输入的数字是:$num";;2)echo"您输入的数字是:$num";;3)echo"您输入的数字是:$num";;*)echo"请输入一个1-3之间数字。";;esac# 执行验证[laoma@shell ~]$bashcase1.sh 请输入一个1-3之间数字:1 您输入的数字是:1[laoma@shell ~]$bashcase1.sh 请输入一个1-3之间数字:4 请输入一个1-3之间数字。3 实践:给输出的字符串加颜色
[laoma@shell ~]$catcase2.sh#!/bin/bashcase$1inPASS)echo-e'\033[1;32mPASS\033[0;39m';;FAIL)echo-e'\033[1;31mFAIL\033[0;39m';;DONE)echo-e'\033[1;35mDONE\033[0;39m';;*)echo"Usage:$0PASS|FAIL|DONE";;esac执行效果:
4 case 语句企业级生产案例
示例1:控制sshd服务
#!/bin/bashcase$1instart)systemctl start sshd;;stop)systemctl stop sshd;;restart|reload)systemctl restart sshd;;status)systemctl status sshd;;*)echo"Usage: case-ssh start|stop|restart|reload|status";;esac简化版:
#!/bin/bashcase$1instart|stop|restart|reload|status)systemctl$1sshd;;*)echo"Usage: case-ssh start|stop|restart|reload|status";;esac示例2:管理用户
通过传参的方式往 /etc/users 里添加用户,具体要求如下。
命令用法为:
Usage: user-mgr [ [-add|-a ] | [ -d|-del ] | [ -s|-search ] ] username传参要求为:
- 参数为-add|-a时,表示添加后面接的用户名。如果有同名的用户, 则不能添加。
- 参数为-del|-d时,表示删除后面接的用户名。如果用户不存在,提示用户不存在。
- 参数为-search|-s时,表示查找后面接的用户名。 如果用户不存在,提示用户不存在。
- 没有用户时应给出明确提示。
/etc/users 保存用户清单,格式如下:
username: laoma username: laowang/etc/users 不能被外部其他程序直接删除及修改。
参考答案:
答案1:
#!/bin/bash# run as root[$UID-ne0]&&echo'Please run as root'&&exit1# create users fileusers_info_file=/etc/users[-f${users_info_file}]||touch${users_info_file}# provides two argsif[$#-ne2];thenecho"Usage: user-mgr [ [-add|-a ] | [ -d|-del ] | [ -s|-search ] ] username"exit2fi# get arg valueaction=$1username=$2# manager usercase$actionin-s|-search)ifgrep-q"username:$username"${users_info_file};thenecho"$usernameis exist."elseecho"$usernameis not exist."fi;;-a|-add)ifgrep-q"username:$username"${users_info_file};thenecho"$usernameis exist."elsechattr -i${users_info_file}echo"username:$username">>${users_info_file}echo"$usernamehas been added."chattr +i${users_info_file}fi;;-d|-del)ifgrep-q"username:$username"${users_info_file};thenchattr -i${users_info_file}sed-i"/username:$username/d"${users_info_file}chattr +i${users_info_file}echo"$usernamehas been deleted."elseecho"$usernameis not exist."fi;;*)echo"Usage: user-mgr [ [-add|-a ] | [ -d|-del ] | [ -s|-search ] ] username";;esac答案2:
#!/bin/bash# run as root[$UID-ne0]&&echo'Please run as root'&&exit1# create users fileusers_info_file=/etc/users[-f${users_info_file}]||touch${users_info_file}functionusage(){echo"Usage: user-mgr [ [-add|-a ] | [ -d|-del ] | [ -s|-search ] ] username"exit2}functionsearch_user(){ifgrep-q$1${users_info_file};thenecho$1is existreturn0elseecho$1is not existreturn1fi}functionadd_user(){search_user$1&>/dev/nullif[$?-eq0];thenecho$1is already existelsechattr -i${users_info_file}echo"username:$1">>${users_info_file}&&echoAdd User Success. chattr +i${users_info_file}fi}functiondel_user(){search_user$1&>/dev/nullif[$?-eq1];thenecho$1is not existelsechattr -i${users_info_file}sed-i"/.*$1/d"${users_info_file}&&echoDel User Success. chattr +i${users_info_file}fi}[$#-ne2]&&usagecase$1in-a|-add)shiftadd_user$1;;-d|-del)shiftdel_user$1;;-s|-search)shiftsearch_user$1;;*)usage;;esac执行验证:
[root@shell laoma]# cat /etc/users# 查找用户[root@shell laoma]# bash user-mgr -s laomalaoma is not exist# 添加用户[root@shell laoma]# bash user-mgr -a laomaAdd User Success.[root@shell laoma]# bash user-mgr -s laomalaoma is exist[root@shell laoma]# cat /etc/usersusername: laoma# 再次添加用户[root@shell laoma]# bash user-mgr -a laomalaoma is already exist# 删除用户[root@shell laoma]# bash user-mgr -d laomaDel User Success.# 再次删除用户[root@shell laoma]# bash user-mgr -d laomalaoma is not exist[root@shell laoma]# cat /etc/users# 其他测试:多个参数[root@shell laoma]# bash user-mgr a b c# 其他测试:普通用户执行[laoma@shell ~]$bashuser-mgr Please run as root5 case 条件语句的 Linux 系统脚本范例
/etc/init.d/network
提示:network-scripts 软件包提供以上脚本。
6 本章小结
- case 语句比较适合变量值较少且为固定的数字或字符串集合的情况,如果变量的值是已知固定的start/stop/restart 等元素,那么采用case语句来实现就比较适合。
- case语句和if条件语句的常见应用场景
- case主要是写服务的启动脚本,一般情况下,传参不同且具有少量的字符串,其适用范围较窄。
- if就是取值判断、比较,应用面比case更广。几乎所有的case语句都可以用if条件语句来实现。
- case语句就相当于多分支的if/elif/else语句,但是case语句的优势是更规范、易读。