linux 命令 case
在 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 "输入数字: " choicecase $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
命令后,您能更高效地处理脚本中的多分支逻辑,尤其在参数解析、菜单设计和文件类型判断等场景中表现突出。