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

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.xdnf.cn/news/18622.html

相关文章:

  • 数据挖掘 4.8 评估泛化能力
  • k8s原理及操作
  • Go语言环境安装
  • Spring面试题及详细答案 125道(16-25) -- 核心概念与基础2
  • Jwt令牌设置介绍
  • c++基础知识入门
  • Https之(三)TLS双向认证
  • 打响“A+H”双重上市突围战,云天励飞实力如何?
  • 云原生俱乐部-RH294知识点归纳(3)
  • [滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组
  • 今天学习计算机网格技术的TCP,UDP以及OSPF
  • 【AI智能体】Dify 搭建业务单据差异核对助手实战详解
  • 【Spring Cloud 微服务】3.智能路由器——深入理解与配置负载均衡
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序
  • 在 Docker 容器中查看 Python 版本
  • SpringBoot的学生学习笔记共享系统设计与实现
  • SO_REUSEADDR
  • 计算机视觉与自然语言处理技术体系概述
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
  • Shell脚本-expect
  • Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点
  • 计算机网络基础(三) --- TCP/IP网络结构(运输层)
  • golang3变量常量
  • Shell脚本-影响shell程序的内置命令
  • MATLAB 在工程仿真中的实践:以机械振动分析为例的完整流程
  • STM32 入门实录:macOS 下从 0 到点亮 LED
  • Java 编译器的世界:前端、JIT 与 AOT 的秘密:详解 Java 的编译过程与编译器生态
  • QT面试题总结(持续更新)
  • Excel 表格 - 合并单元格、清除单元格格式
  • kubernetes中的认证和授权