case
是 Shell 脚本中用于 多条件分支匹配 的控制结构,比 if-elif-else
更简洁,适用于模式匹配(如字符串、数字、通配符等)。
1. case
基本语法
case "$变量" in
模式1)
命令1
;;
模式2)
命令2
;;
*)
命令N
;;
esac
示例:
[root@lichu ~]# vim grade_check_case.sh
#!/bin/bash
# 提示用户输入成绩
read -p "请输入成绩(0-100):" score
# 检查输入是否为数字
if ! [[ "$score" =~ ^[0-9]+$ ]]; then
echo "错误:请输入有效的数字!"
exit 1
fi
# 使用 case 判断成绩等级
case $score in
9[0-9]|100) # 90-100
echo "成绩等级:A(优秀)"
;;
8[0-9]) # 80-89
echo "成绩等级:B(良好)"
;;
7[0-9]) # 70-79
echo "成绩等级:C(中等)"
;;
6[0-9]) # 60-69
echo "成绩等级:D(及格)"
;;
[0-9]|[1-5][0-9]) # 0-59
echo "成绩等级:F(不及格)"
;;
*) # 无效输入
echo "错误:成绩必须在 0-100 之间!"
;;
esac
2. 模式匹配规则
模式 | 说明 |
---|---|
abc | 精确匹配字符串 abc |
yes|y | 匹配 yes 或 y (| 分隔) |
[0-9] | 匹配单个数字 |
* | 匹配任意字符 |
3. 运维实战案例
案例 1:根据服务名管理服务
[root@lichu ~]# vim manage_services.sh
#!/bin/bash
service="$1"
case "$service" in
nginx|httpd)
echo "管理Web服务: $service"
systemctl restart "$service"
;;
mysql|mariadb)
echo "管理数据库服务: $service"
systemctl status "$service"
;;
*)
echo "未知服务: $service"
;;
esac
[root@lichu ~]# ./manage_services.sh nginx # 管理Web服务
[root@lichu ~]# ./manage_services.sh mysql # 管理数据库服务
案例 2:根据文件扩展名处理文件
[root@lichu ~]# vim process_files.sh #!/bin/bash file="$1" case "$file" in *.tar.gz|*.tgz) echo "解压 tar.gz 文件: $file" tar -xzf "$file" ;; *.zip) echo "解压 zip 文件: $file" unzip "$file" ;; *.sh) echo "执行 Shell 脚本: $file" bash "$file" ;; *) echo "不支持的文件类型: $file" ;; esac [root@lichu ~]# ./process_files.sh backup.tar.gz # 解压tar.gz [root@lichu ~]# ./process_files.sh install.sh # 执行脚本
案例 3:系统工具箱(交互式菜单)
[root@lichu ~]# vim sys_toolkit.sh
#!/bin/bash
echo "1. 检查磁盘空间"
echo "2. 检查内存使用"
echo "3. 检查网络连接"
read -p "请选择操作 (1-3): " choice
case "$choice" in
1)
df -h
;;
2)
free -h
;;
3)
ping -c2 baidu.com
;;
*)
echo "无效输入!"
exit 1
;;
esac
案例 4:根据操作系统类型安装软件
[root@lichu ~]# vim install_nginx_case.sh
#!/bin/bash
# 脚本名称: install_nginx_case.sh
# 功能: 自动检测系统类型并安装Nginx
# 使用方法: sudo ./install_nginx_case.sh
# 检查root权限
if [ "$(id -u)" != "0" ]; then
echo "错误: 必须使用root用户或sudo运行此脚本"
exit 1
fi
# 检测系统类型
if [ -f /etc/redhat-release ]; then
OS_TYPE=centos
elif [ -f /etc/lsb-release ]; then
OS_TYPE=ubuntu
else
OS_TYPE=other
fi
# 使用case语句选择安装方式
case $OS_TYPE in
centos)
echo "[INFO] 检测到CentOS/RHEL系统,使用yum安装Nginx..."
yum install -y epel-release
yum install -y nginx
systemctl start nginx
systemctl enable nginx
;;
ubuntu)
echo "[INFO] 检测到Ubuntu系统,使用apt安装Nginx..."
apt-get update
apt-get install -y nginx
systemctl start nginx
systemctl enable nginx
;;
*)
echo "[ERROR] 不支持的操作系统: $OS_TYPE"
exit 1
;;
esac
# 验证安装[可选]
if which nginx &>/dev/null; then
echo -e "\n[SUCCESS] Nginx安装成功!"
echo -e "Nginx版本信息:$(nginx -v 2>&1 | awk -F"/" '{print $2}')"
echo -e "服务状态:"
systemctl status nginx | grep -E "Active:|Loaded:"
echo -e "\n请通过浏览器访问服务器IP验证Nginx是否正常运行"
else
echo "[ERROR] Nginx安装失败"
exit 1
fi