linux 命令 case

server/2025/3/15 18:31:24/

在 Linux Shell 脚本中,case 是一个强大的多条件分支控制命令,用于基于模式匹配执行不同代码块。它类似于其他编程语言中的 switch-case 语句,但更灵活,支持通配符和模式组合。以下是其核心用法和实

一、基础语法

case 变量 in
  模式1)
    命令1   # 匹配模式1时执行
    ;;
  模式2|模式3)
    命令2   # 匹配模式2或模式3时执行
    ;;
  *)
    默认命令  # 其他所有情况
    ;;
esac 

关键符号: 

 

  • ;;:结束当前分支(类似 break)。

  • |:逻辑“或”,匹配多个模式。

  • *):默认分支(类似 default)。

二、模式匹配规则 

1. 通配符支持

  • *:匹配任意字符(包括空字符)。

  • ?:匹配单个任意字符。

  • [...]:匹配指定字符范围(如 [a-z][0-9])。

  • |:逻辑“或”组合多个模式。

2. 示例模式 

case $input in
  # 匹配 "yes"(不区分大小写)
  [yY]|[yY][eE][sS])
    echo "用户同意"
    ;;
  # 匹配以 .txt 或 .log 结尾的文件
  *.txt|*.log)
    echo "文本或日志文件"
    ;;
  # 匹配 3 位数字
  [0-9][0-9][0-9])
    echo "三位数"
    ;;
  *)
    echo "未知输入"
    ;;
esac 

 

 三、经典使用场景

1. 处理命令行参数 

 #!/bin/bash
case $1 in
  "-h"|"--help")
    echo "用法: $0 [start|stop|status]"
    ;;
  "start")
    echo "启动服务..."
    systemctl start myapp
    ;;
  "stop")
    echo "停止服务..."
    systemctl stop myapp
    ;;
  "status")
    systemctl status myapp
    ;;
  *)
    echo "错误:未知参数 '$1'"
    exit 1
    ;;
esac

2. 文件类型判断 

filename="backup.tar.gz"
case $filename in
  *.tar|*.tar.gz|*.tgz)
    echo "压缩包文件,使用 tar 解压..."
    tar -xf $filename
    ;;
  *.zip)
    echo "ZIP 文件,使用 unzip 解压..."
    unzip $filename
    ;;
  *.sh)
    echo "Shell 脚本,检查权限..."
    [ -x "$filename" ] || chmod +x $filename
    ;;
  *)
    echo "不支持的文件类型"
    ;;
esac 

3. 交互式菜单选择 

#!/bin/bash
echo "选择操作:"
echo "1) 安装软件"
echo "2) 卸载软件"
echo "3) 退出"
read -p "输入数字: " choice

case $choice in
  1)
    echo "开始安装..."
    apt install package
    ;;
  2)
    echo "开始卸载..."
    apt remove package
    ;;
  3)
    echo "退出程序"
    exit 0
    ;;
  *)
    echo "无效选项!"
    ;;
esac

四、高级技巧 

 1. 正则表达式扩展(需 shopt -s extglob

 shopt -s extglob  # 启用扩展模式
case $input in
  # 匹配 0 或 1 个 "abc"
  +(abc))
    echo "匹配 1 次或多次 abc"
    ;;
  # 匹配任意数字开头
  [0-9]*)
    echo "以数字开头"
    ;;
esac

五、常见错误与避坑指南 

忘记 ;; 结束符
每个分支必须以 ;; 结尾,否则会继续执行下一个分支的命令。
错误示例

case $var in
  "a") echo "A"   # 缺少 ;;
  "b") echo "B" ;;
esac

 未处理默认分支

    建议始终添加 *) 分支处理意外输入,避免静默失败。 

 case $input in
  "yes") echo "同意" ;;
  *)     echo "请输入 yes" ;;
esac

六、case vs if 如何选择? 

 

场景推荐工具理由
固定模式匹配(如字符串、文件类型)case语法简洁,支持通配符和模式组合
数值比较、复杂逻辑判断if支持 -eq-gt 等数值运算符和逻辑运算
简单单行条件&&/``快速判断(如 [ -f file ] && rm file

 掌握 case 命令后,您能更高效地处理脚本中的多分支逻辑,尤其在参数解析、菜单设计和文件类型判断等场景中表现突出。


http://www.ppmy.cn/server/175231.html

相关文章

基于相量测量单元(PMU)的电力系统故障分析MATLAB仿真

“电气仔推送”获得资料(专享优惠) 模型简介: PMU是用于电力系统状态估计的Matlab函数,特别是使用相量测量单元(PMU)数据来估计系统的状态。它的主要功能是通过处理来自电网各个节点的测量数据来估计电网的电压大小和相角。此模…

基于Java 童装在线销售系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要: 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法,但这…

策略模式(Strategy Pattern)与状态模式(State Pattern)的异同

相同点 行为委托 两者均通过将行为委托给其他对象来实现功能解耦,遵循“组合优于继承”的原则。 策略模式:将算法逻辑委托给具体的策略类。 状态模式:将状态相关的行为委托给具体的状态类。 类结构相似 两者在类图结构上高度相似&#xff…

C#—【在不同的场景该用哪种线程?】

C#—【在不同的场景该用哪种线程?】 在C#中有很多种线程操作方法但都运用在不同的场景。 以下是针对不同场景选择 线程(Thread)、线程池(ThreadPool)、异步编程(async/await) 或 后台线程&…

IDEA中链接使用mysql数据库

一、连接mysql 1. 打开idea,在右上角侧边栏有数据库database插件,打开侧边栏点击加号->数据源,可以看到支持很多数据库,选择mysql。 2. 首次使用需要下载驱动程序,不然连接数据库会报错。找到mysql,点击…

STM32U575RIT6单片机(三)

作业1:使用中断控制光电开关打开蜂鸣器 volatile int flag0; //重写中断回调函数 void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) //void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) {if(GPIO_PinPhotoElectric_Pin){flag1;} } void HAL_GPIO_EXTI_Fall…

HADOOP环境配置关闭防火墙

关闭防火墙 为了避免出现网络不通的问题,我们可以简单的在集群内部关闭防火墙 输入下面指令 # 关闭防火墙 systemctl stop firewalld #关闭开机自启 systemctl disable firewalld

【零基础入门unity游戏开发——进阶篇】Unity Microphone类处理麦克风相关信息,录制音频并实时处理或保存录制的音频数据

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…