当前位置: 首页 > news >正文

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

使用技巧与注意事项

  1. 模式匹配:Case 支持多种模式匹配方式,包括通配符和正则表达式
  2. 多个模式:可以用 | 分隔多个模式,如 start|begin|run)
  3. 结束标记:每个代码块必须以 ;; 结束(最后一项可省略)
  4. 默认情况:使用 *) 处理未匹配的情况,相当于 if-else 中的 else

Case vs If 选择指南

  • Case 更适合:固定选项值、服务脚本、菜单选择
  • If 更适合:范围判断、复杂条件、数值比较

总结

Case 语句是 Shell 脚本中处理多分支条件的利器,结构清晰且易于维护。特别适合编写系统管理脚本和处理用户输入选项。掌握了 Case 语句,能让你的脚本更加专业和易读!

http://www.dtcms.com/a/347957.html

相关文章:

  • EP01:【DA】数据分析的概述
  • 01Shell脚本入门:基础命令与变量解析
  • JVM之【类加载系统】
  • 【Qt开发】常用控件(六)
  • Golang云端编程深度指南:架构本质与高阶实践
  • Flink Slot 不足导致任务Pending修复方案
  • 互联网大厂Java面试实录:从Spring到微服务的全面考察
  • 【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
  • 个人搭建小网站教程(云服务器Ubuntu版本)
  • 【数据结构】二叉树的顺序存储、堆的实现及其应用:堆排序与Top-K问题
  • 以国产IoTDB为代表的主流时序数据库架构与性能深度选型评测
  • kanass V1.1.4版本发布,支持Mysql数据库、ubuntu安装与Mantis数据导入
  • Thonny+MicroPython搭建ESP32芯片开发环境
  • 代码性能测试——benchmark库
  • Elasticsearch Ruby 客户端故障排查实战指南
  • AI与SEO关键词协同优化
  • DBeaver连接SQL Server集成认证问题解决方案
  • xxl-job 启动后导致pod内存使用率持续增加
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化
  • MATLAB 与 Simulink 联合仿真:控制系统建模与动态性能优化
  • C#_gRPC
  • RabbitMQ--消费端异常处理与 Spring Retry
  • 阿里云拉取dockers镜像
  • 在JavaScript中,比较两个数组是否有相同元素(交集)的常用方法
  • 今日科技热点 | AI加速创新,5G与量子计算引领未来
  • wpf之DockPanel
  • 3D打印机管理后台与RabbitMQ集成的业务场景
  • RabbitMQ面试精讲 Day 29:版本升级与平滑迁移
  • 【图像处理基石】基于 Python 的图像行人删除技术:实现街景无干扰化处理
  • 性能比拼: .NET (C#) vs. Fiber (Go)