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 清爽,配合 * 兜底不会漏情况。