Shell 条件语句详解
在 Shell 脚本编程中,条件判断是控制程序流程的核心。本章节将详细讲解两种常用的条件语句:if...then...fi 和 case...esac。
1. if...then...fi 语句
if...then...fi 是 Shell 中最基本的条件判断结构,用于根据条件表达式的真假执行不同的命令。
语法结构
bash
if [ 条件表达式 ]
then
# 条件为真时执行的命令表
命令1
命令2
...
fi
if和fi: 必须成对出现,分别标记条件语句的开始和结束。[ 条件表达式 ]: 方括号[ ]是test命令的简写,用于评估条件。表达式与方括号之间必须有空格。then: 位于条件表达式之后,表示条件为真时要执行的代码块的开始。- 命令表 : 位于
then和fi之间,可以包含一条或多条命令。
执行逻辑
- 评估
if后面的条件表达式。 - 如果表达式为真(返回状态码 0),则执行
then和fi之间的所有命令。 - 如果表达式为假(返回非零状态码),则跳过
then块,直接执行fi后面的语句。
示例
bash
#!/bin/bash
read -p "请输入一个数字: " num
if [ $num -gt 10 ]
then
echo "您输入的数字大于 10。"
fi
echo "判断结束。"
运行结果:
- 输入
15,输出:您输入的数字大于 10。和判断结束。 - 输入
5,输出:判断结束。
2. case...esac 语句
case...esac 是一种多路分支选择语句,非常适合根据一个变量的不同取值执行不同的代码块,比多个 if-elif 语句更清晰。
语法结构
bash
case 字符串变量 in
模式1)
命令表1
;;
模式2 | 模式3)
命令表2
;;
...
模式n)
命令表n
;;
*)
默认命令表
;;
esac
case和esac: 必须成对出现,分别标记多路分支语句的开始和结束。字符串变量: 被匹配的变量或值。模式): 每个分支以模式结束,模式可以包含通配符(如*,?,[ ])。多个模式可以用|连接表示"或"关系。;;: 双分号是每个分支的终止符,表示该分支执行完毕,跳出整个case语句。*): 类似于其他语言中的default,匹配所有未列出的情况。
执行逻辑
- 计算
case后面的字符串变量的值。 - 从上到下依次与各个模式进行匹配。
- 一旦匹配成功,则执行对应分支的命令表,直到遇到
;;后跳出整个case结构。 - 如果没有模式匹配,且存在
*)分支,则执行默认命令表。
示例
bash
#!/bin/bash
echo "请选择操作:"
echo "1) 启动服务"
echo "2) 停止服务"
echo "3) 重启服务"
read -p "请输入选项 (1-3): " choice
case $choice in
1)
echo "正在启动服务..."
# systemctl start myservice
;;
2)
echo "正在停止服务..."
# systemctl stop myservice
;;
3)
echo "正在重启服务..."
# systemctl restart myservice
;;
*)
echo "输入错误!请输入 1, 2 或 3。"
;;
esac
echo "case 语句执行完毕。"
运行结果:
- 输入
1,输出:正在启动服务...和case 语句执行完毕。 - 输入
4,输出:输入错误!请输入 1, 2 或 3。和case 语句执行完毕。
总结与对比
| 特性 | if...then...fi |
case...esac |
|---|---|---|
| 用途 | 基于条件表达式(真/假)进行分支。 | 基于字符串模式匹配进行多路分支。 |
| 结构 | if-then-fi,可配合 elif、else。 |
case-in-esac,每个分支以 模式) 开始,以 ;; 结束。 |
| 可读性 | 适合复杂的逻辑判断。 | 适合对单一变量的多个离散值进行判断,代码更简洁。 |
| 终止符 | 无特殊终止符,块由关键字界定。 | 每个分支必须用 ;; 终止。 |
掌握这两种条件语句,能够让你编写出逻辑清晰、结构严谨的 Shell 脚本。