一、前言
在 Linux 系统中,Shell 脚本是系统管理、自动化任务和运维工作中不可或缺的工具。而条件判断是 Shell 脚本中最核心的控制结构之一,它决定了程序的执行流程,让脚本具备"智能"判断能力。
本文将全面讲解 Shell 脚本中条件判断的语法格式 ,包括 test
命令、[ ]
、[[ ]]
和 (( ))
四种常见形式,并结合实际示例帮助你掌握其使用方法和注意事项。
二、Shell 条件判断的四种语法格式
Shell 中有四种常用的条件判断写法,它们各有特点,适用于不同场景。
1. 使用 test
命令
test
是最基础的条件判断命令,语法如下:
bash
test 表达式
示例:
bash
#!/bin/bash
if test 10 -gt 5; then
echo "10 大于 5"
fi
✅ 特点:兼容性好,适用于所有 POSIX 标准的 shell。
2. 使用 [ ]
(中括号)
这是 test
命令的等价写法,更常见于脚本中:
bash
[ 表达式 ]
注意: 中括号与表达式之间必须有空格!
示例:
bash
#!/bin/bash
num=20
if [ $num -eq 20 ]; then
echo "数值相等"
fi
✅ 特点:简洁,广泛使用。
⚠️ 注意:
[ ]
不支持正则表达式和通配符匹配。
3. 使用 [[ ]]
(双中括号)------ 推荐使用
[[ ]]
是 Bash 的扩展语法,功能更强大,支持字符串模式匹配、逻辑运算符 &&
和 ||
等。
bash
[[ 表达式 ]]
示例:
bash
#!/bin/bash
name="alice"
if [[ $name == "alice" ]]; then
echo "用户名正确"
fi
# 支持通配符
if [[ $name == a* ]]; then
echo "名字以 a 开头"
fi
✅ 特点:
- 支持
&&
、||
、!
逻辑运算符 - 支持
==
、!=
字符串匹配(支持通配符) - 不需要对变量加引号(但仍建议加)
⚠️ 注意:
[[ ]]
仅在 Bash、Zsh 等现代 shell 中可用,不适用于sh
。
4. 使用 (( ))
(双小括号)------ 数值计算专用
(( ))
用于数值比较和算术运算,语法更接近 C 语言。
bash
(( 表达式 ))
示例:
bash
#!/bin/bash
a=10
b=5
if (( a > b )); then
echo "a 大于 b"
fi
# 支持复合运算
if (( a > 5 && b < 10 )); then
echo "条件成立"
fi
✅ 特点:
- 专用于数值判断
- 支持
>
,<
,>=
,<=
,==
,!=
,&&
,||
等 - 写法简洁,无需使用
-gt
、-lt
等参数
三、常用条件判断类型
1. 数值比较
运算符 | 含义 | 示例 |
---|---|---|
-eq |
等于 | [ 5 -eq 5 ] |
-ne |
不等于 | [ 5 -ne 3 ] |
-gt |
大于 | [ 5 -gt 3 ] |
-ge |
大于等于 | [ 5 -ge 5 ] |
-lt |
小于 | [ 3 -lt 5 ] |
-le |
小于等于 | [ 3 -le 5 ] |
💡 使用
(( ))
时可用>
,<
,==
等符号。
2. 字符串比较
运算符 | 含义 | 示例 |
---|---|---|
= 或 == |
等于 | [ "a" = "a" ] |
!= |
不等于 | [ "a" != "b" ] |
-z |
字符串为空 | [ -z "" ] |
-n |
字符串非空 | [ -n "hello" ] |
示例:
bash
str=""
if [ -z "$str" ]; then
echo "字符串为空"
fi
✅ 建议:字符串变量使用双引号包围,防止空值导致语法错误。
3. 文件测试
运算符 | 含义 | 示例 |
---|---|---|
-f file |
是否为普通文件 | [ -f /etc/passwd ] |
-d dir |
是否为目录 | [ -d /tmp ] |
-e file |
是否存在 | [ -e /bin/bash ] |
-r file |
是否可读 | [ -r file.txt ] |
-w file |
是否可写 | [ -w file.txt ] |
-x file |
是否可执行 | [ -x script.sh ] |
示例:
bash
if [ -f "/etc/hosts" ]; then
echo "hosts 文件存在"
fi
四、逻辑运算符
运算符 | 说明 | 用法 |
---|---|---|
&& |
逻辑与 | [[ 条件1 && 条件2 ]] |
` | ` | |
! |
逻辑非 | [[ ! 条件 ]] |
⚠️ 注意:
[ ]
中需使用-a
(与)、-o
(或),不推荐使用。- 推荐使用
[[ ]]
配合&&
和||
,更清晰易读。
五、实战示例:判断文件是否存在并可读
bash
#!/bin/bash
filename="data.txt"
if [[ -f "$filename" && -r "$filename" ]]; then
echo "文件存在且可读,开始处理..."
cat "$filename"
else
echo "文件不存在或不可读!"
exit 1
fi
六、常见错误与注意事项
错误 | 原因 | 解决方法 |
---|---|---|
缺少空格 | [ $var=5 ] |
正确写法:[ $var = 5 ] |
变量未加引号 | $var 为空时报错 |
使用 "$var" |
使用 [ ] 写复杂逻辑 |
不支持 && 、` |
|
在 sh 中使用 [[ ]] |
兼容性问题 | 改为 [ ] 或使用 bash 执行 |
七、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!