Shell 流程控制:if 条件判断与 case 分支语句
流程控制是 Shell 脚本的核心功能,通过 if
和 case
语句可以实现根据不同条件执行不同命令的逻辑。本文将详细讲解这两种语句的语法、用法及注意事项。
if 条件判断语句
if
语句通过判断条件的真假来执行不同的命令块,支持单分支、双分支和多分支结构。
基本语法
1 | # 单分支 |
注意:
then
可以和if
写在同一行,用分号分隔:if 条件; then
- 语句块必须以
fi
(if
的反写)结束。
条件表达式的写法
Shell 中条件判断主要通过 test
命令或方括号 []
实现,两者功能完全相同。
(1)数值比较
运算符 | 含义 | 示例 |
---|---|---|
-eq |
等于 | [ $a -eq $b ] |
-ne |
不等于 | [ $a -ne $b ] |
-gt |
大于 | [ $a -gt $b ] |
-lt |
小于 | [ $a -lt $b ] |
-ge |
大于等于 | [ $a -ge $b ] |
-le |
小于等于 | [ $a -le $b ] |
示例:
1 | a=10 |
(2)字符串比较
运算符 | 含义 | 示例 |
---|---|---|
= |
等于(注意不是 == ,部分 Shell 兼容但不推荐) |
[ "$str1" = "$str2" ] |
!= |
不等于 | [ "$str1" != "$str2" ] |
-z |
字符串长度为 0 | [ -z "$str" ] |
-n |
字符串长度不为 0 | [ -n "$str" ] |
示例:
1 | name="Shell" |
注意:字符串变量必须用双引号包裹,避免空值导致语法错误。
(3)文件判断
运算符 | 含义 | 示例 |
---|---|---|
-f |
是否为普通文件 | [ -f "file.txt" ] |
-d |
是否为目录 | [ -d "dir" ] |
-e |
文件或目录是否存在 | [ -e "path" ] |
-r |
是否有读权限 | [ -r "file.txt" ] |
-w |
是否有写权限 | [ -w "file.txt" ] |
-x |
是否有执行权限 | [ -x "script.sh" ] |
示例:
1 | file="test.sh" |
逻辑运算符
多条件判断可使用逻辑运算符:
&&
:逻辑与(条件都为真才成立)||
:逻辑或(至少一个条件为真)!
:逻辑非(取反)
1 | age=25 |
case 分支语句
case
语句适用于多值匹配场景,通过匹配变量与不同模式,执行对应的命令块,比多分支 if
语句更简洁。
基本语法
1 | case 变量 in |
注意:
- 每个模式必须以
)
结尾 - 每个分支必须以
;;
结束(类似其他语言的break
) *
表示默认模式,通常放在最后
模式匹配规则
case
支持通配符匹配:
*
:匹配任意长度的任意字符(如a*
匹配以a
开头的字符串)?
:匹配任意单个字符(如a?
匹配ab
、ac
等)[abc]
:匹配a
、b
、c
中的任意一个(如[0-9]
匹配数字)|
:匹配多个模式中的一个(如a|b
匹配a
或b
)
示例
(1)简单匹配
1 | echo "请输入数字(1-3):" |
(2)通配符匹配
1 | echo "请输入一个字符:" |
(3)多模式匹配
1 | echo "请输入操作(start/stop/restart):" |
常见错误与注意事项
- 方括号的空格:
[
和]
前后必须有空格,如[ $a -eq $b ]
正确,[$a -eq $b]
错误。 - 变量引用:字符串变量和可能为空的变量必须用双引号包裹,避免语法错误。
- 分号和双分号:
if
中then
前的分号、case
中的;;
不能省略。 - 模式顺序:
case
中模式匹配从上到下,找到第一个匹配项后就会退出,因此更具体的模式应放在前面,*
放在最后。
v1.3.10