Shell Case 条件语句详解
Shell Case 条件语句详解
什么是 Case 条件语句?
Case 语句是 Shell 脚本中的多分支条件判断工具,相当于增强版的 if/elif/else 语句。它的结构更清晰易读,特别适合处理固定的选项值,常用于编写系统服务启动脚本等场景。
Case 语句的工作原理很简单:它会将变量的值与一系列模式进行匹配,执行第一个匹配的模式对应的代码块。
Case 语句基本语法
bash
case "变量值" in模式1)# 匹配模式1时执行的命令;;模式2)# 匹配模式2时执行的命令;;*) # 默认情况(匹配任何其他值);;
esac
记忆小窍门(中文版):
bash
case "找对象条件" in有房有车)可以考虑交往;;有房或有车)再了解一下;;没房没车)暂时不考虑;;*)看缘分吧;;
esac
基础示例
示例1:判断数字范围
bash
#!/bin/bash
read -p "请输入1-3之间的数字:" numcase $num in1)echo "您输入的是:1";;2)echo "您输入的是:2";;3)echo "您输入的是:3";;*)echo "请输入1-3之间的数字!";;
esac
执行效果:
text
$ bash case1.sh
请输入1-3之间的数字:2
您输入的是:2$ bash case1.sh
请输入1-3之间的数字:5
请输入1-3之间的数字!
示例2:输出带颜色的文本
bash
#!/bin/bash
case $1 inPASS)# 绿色文本echo -e '\033[1;32mPASS\033[0m';;FAIL) # 红色文本echo -e '\033[1;31mFAIL\033[0m';;DONE)# 紫色文本echo -e '\033[1;35mDONE\033[0m';;*)echo "用法: $0 PASS|FAIL|DONE";;
esac
执行效果:
text
$ bash case2.sh PASS
PASS # 显示为绿色
$ bash case2.sh FAIL
FAIL # 显示为红色
实际应用案例
案例1:服务管理脚本
bash
#!/bin/bash
# 服务管理脚本 - 控制sshd服务case $1 instart)systemctl start sshdecho "sshd服务已启动";;stop)systemctl stop sshd echo "sshd服务已停止";;restart|reload) # 两种写法都支持systemctl restart sshdecho "sshd服务已重启";;status)systemctl status sshd;;*)echo "用法: $0 {start|stop|restart|reload|status}"exit 1;;
esac
简化版(更高效):
bash
#!/bin/bash
case $1 instart|stop|restart|reload|status)systemctl $1 sshd # 直接使用参数作为命令;;*)echo "用法: $0 {start|stop|restart|reload|status}"exit 1;;
esac
案例2:用户管理系统
bash
#!/bin/bash
# 用户管理系统 - 通过case语句管理用户信息# 检查是否以root权限运行
[ $(id -u) -ne 0 ] && echo "请使用root权限运行" && exit 1# 用户数据文件
USER_FILE="/etc/users"
[ -f "$USER_FILE" ] || touch "$USER_FILE"# 参数检查
if [ $# -ne 2 ]; thenecho "用法: $0 [-add|-a|-del|-d|-search|-s] 用户名"exit 2
fiaction=$1
username=$2case $action in-s|-search)# 搜索用户if grep -q "username: $username" "$USER_FILE"; thenecho "用户 $username 存在"elseecho "用户 $username 不存在"fi;;-a|-add)# 添加用户if grep -q "username: $username" "$USER_FILE"; thenecho "用户 $username 已存在,无法添加"elsechattr -i "$USER_FILE" # 解除文件锁定echo "username: $username" >> "$USER_FILE"chattr +i "$USER_FILE" # 锁定文件防止误修改echo "用户 $username 添加成功"fi;;-d|-del)# 删除用户if grep -q "username: $username" "$USER_FILE"; thenchattr -i "$USER_FILE"sed -i "/username: $username/d" "$USER_FILE"chattr +i "$USER_FILE"echo "用户 $username 删除成功"elseecho "用户 $username 不存在,无法删除"fi;;*)# 错误参数处理echo "用法: $0 [-add|-a|-del|-d|-search|-s] 用户名"exit 1;;
esac
使用技巧与注意事项
- 模式匹配:Case 支持多种模式匹配方式,包括通配符和正则表达式
- 多个模式:可以用
|
分隔多个模式,如start|begin|run)
- 结束标记:每个代码块必须以
;;
结束(最后一项可省略) - 默认情况:使用
*)
处理未匹配的情况,相当于 if-else 中的 else
Case vs If 选择指南
- Case 更适合:固定选项值、服务脚本、菜单选择
- If 更适合:范围判断、复杂条件、数值比较
总结
Case 语句是 Shell 脚本中处理多分支条件的利器,结构清晰且易于维护。特别适合编写系统管理脚本和处理用户输入选项。掌握了 Case 语句,能让你的脚本更加专业和易读!