首页 / Linux 命令行入门教程 / 87. case 分支结构

Linux 命令行入门教程

87. case 分支结构

本教程共 90 篇 · 第 87 篇

87. case 分支结构

当要判断的”值”有很多种可能,if/elif 会越写越长。这种场景用 case 更清爽。

case 的样子

case 按”模式”匹配变量,命中哪条走哪条,* 兜底其他情况:

#!/bin/bash
read -p "输入水果名:" fruit
case "$fruit" in
  苹果|)
    echo "这是仁果类"
    ;;
  香蕉|芒果)
    echo "这是热带水果"
    ;;
  *)
    echo "不认识这种水果"
    ;;
esac

) 后面写命中的处理,;; 表示这一段结束。竖线 | 表示”或”,多个模式用同一个处理。esac 是收尾(case 反过来)。

和 if 对比

同样的逻辑用 if 写会这样:

if [ "$fruit" = "苹果" ] || [ "$fruit" = "梨" ]; then
  echo "这是仁果类"
elif [ "$fruit" = "香蕉" ] || [ "$fruit" = "芒果" ]; then
  echo "这是热带水果"
else
  echo "不认识这种水果"
fi

case 把”按一个变量分情况”表达得更直白,可读性更高。

实战小例

根据文件后缀决定处理方式:

#!/bin/bash
file="$1"
case "$file" in
  *.jpg|*.png|*.gif)
    echo "图片文件"
    ;;
  *.txt|*.md)
    echo "文本文件"
    ;;
  *.sh)
    echo "脚本文件"
    ;;
  *)
    echo "未知类型"
    ;;
esac

*.jpg 这种写法用了通配符(如 §12 所述),匹配以 .jpg 结尾的字符串。

Tip

case 的模式支持通配符和 | 或。需要”精确相等”时直接写字符串,需要”一类”就用通配符,灵活好用。

小结:case 专门解决”一个变量、多种分支”的判断。比嵌套 if 清爽,配合 * 兜底不会漏情况。