Linux Shell 条件判断:`test`、`[`、`[[` 命令深度解析
在 Linux Shell 脚本的广袤世界中,条件判断是构建智能逻辑的灵魂。它赋予脚本决策能力,使其能根据实时状态灵活响应。本文将带您深入探索 Shell 中最核心且功能强大的三大条件测试工具:test
、[
和 [[
,揭示它们的奥秘,并提供最佳实践指导。
test
命令:条件判断的基石
作为 Shell 条件判断的鼻祖,test
命令依据表达式的真伪,返回一个退出状态码:0
代表真,非 0
代表假。它是 if
语句逻辑判断的幕后英雄。
核心语法: test EXPRESSION
速览:
if test -f "config.yaml"; thenecho "配置文件存在。"
fi
[
命令:更具可读性的 test
语法糖
[
命令是 test
的一个简洁别名,旨在提升脚本的可读性。使用时,务必在表达式末尾加上 ]
,且 [
与 ]
两侧都需留有空格。
核心语法: [ EXPRESSION ]
【重要提示:变量引用护航】
为避免因变量值中的空格或特殊字符导致解析错误,强烈建议使用双引号 ("
) 包裹所有变量(如 "$my_variable"
)。这是 Shell 脚本的黄金法则。
速览:
username="shell_master"if [ -n "$username" ]; then # `-n`:判断字符串非空echo "用户名:$username"
elseecho "用户名未设置。"
fi
[[
命令:Bash 专属的现代与强大
[[ ... ]]
是 Bash Shell 独有的增强型条件表达式,它弥补了 [
的不足,提供了更安全、更灵活的特性。在 Bash 环境下,它无疑是条件判断的首选。
核心语法: [[ EXPRESSION ]]
[[ ... ]]
的显著优势:
- 告别繁琐转义:
*
、?
、<
、>
、&&
、||
等特殊字符可直接使用。 - 内置正则匹配: 引入
=~
操作符,原生支持正则表达式匹配。 - 变量安全升级: 即使不显式加引号,变量在
[[ ... ]]
内也较少受单词拆分等影响。 - C 风格逻辑: 支持直观的
&&
(逻辑与) 和||
(逻辑或) 运算符。
速览:
log_file="app.log.20250730"
access_level=5# 正则表达式匹配 (`=~`)
if [[ "$log_file" =~ \.log\.202[0-9]{5}$ ]]; thenecho "这是一个有效的日志文件名。"
fi# 复合逻辑 (`&&` 和 `||`)
if [[ -d "/var/data" && $access_level -ge 3 ]]; thenecho "数据目录存在且权限足够。"
fi
核心操作符:统一的条件判断语言
尽管 test
、[
和 [[
语法形式各异,但它们共享一套核心的条件测试操作符。理解这些操作符是编写高效脚本的关键。
文件属性测试
操作符 | 描述 | 示例 |
---|---|---|
-d FILE | 是目录 | [ -d /home/user ] |
-f FILE | 是普通文件 | [ -f /etc/fstab ] |
-e FILE | 存在 (文件或目录) | [ -e /tmp/temp.txt ] |
-r FILE | 可读 | [ -r /etc/shadow ] |
-w FILE | 可写 | [ -w /tmp/new_file ] |
-x FILE | 可执行 | [ -x /usr/bin/ls ] |
-s FILE | 非空 (文件大小 > 0) | [ -s error.log ] |
-h FILE | 是符号链接 | [ -h /bin/sh ] |
F1 -nt F2 | F1 比 F2 新 (new than) | [ "$new" -nt "$old" ] |
F1 -ot F2 | F1 比 F2 旧 (older than) | [ "$old" -ot "$new" ] |
F1 -ef F2 | F1 和 F2 相同 (硬链接) | [ "$a" -ef "$b" ] |
字符串比较与测试
操作符 | 描述 | [ ... ] 示例 | [[ ... ]] 示例 |
---|---|---|---|
-z STRING | 字符串为空 | [ -z "$input" ] | [[ -z "$input" ]] |
-n STRING | 字符串非空 | [ -n "$input" ] | [[ -n "$input" ]] |
S1 = S2 | 字符串相等 | [ "$var" = "value" ] | [[ "$var" = "value" ]] |
S1 == S2 | 字符串相等 ([[ 专属) | - | [[ "$a" == "$b" ]] |
S1 != S2 | 字符串不相等 | [ "$var" != "value" ] | [[ "$var" != "value" ]] |
S1 < S2 | 字典序小于 (需转义) | [ "$a" \< "$b" ] | [[ "$a" < "$b" ]] |
S1 > S2 | 字典序大于 (需转义) | [ "$a" \> "$b" ] | [[ "$a" > "$b" ]] |
STRING =~ REGEX | 匹配正则表达式 ([[ 专属) | - | [[ $url =~ ^https?:// ]] |
整数数值比较
操作符 | 描述 | 示例 |
---|---|---|
I1 -eq I2 | 等于 | [ "$count" -eq 10 ] |
I1 -ne I2 | 不等于 | [ "$num" -ne 0 ] |
I1 -gt I2 | 大于 | [ "$age" -gt 18 ] |
I1 -ge I2 | 大于等于 | [ "$score" -ge 60 ] |
I1 -lt I2 | 小于 | [ "$temp" -lt 0 ] |
I1 -le I2 | 小于等于 | [ "$price" -le 100 ] |
逻辑组合操作符
操作符 | 描述 | 适用范围 | 示例 |
---|---|---|---|
! EXPR | 逻辑非 | 所有 | [ ! -d /path ] |
EXPR1 && EXPR2 | 逻辑与 (AND) | 仅 [[ | [[ -f "$log" && -w "$log" ]] |
`EXPR1 | EXPR2` | 逻辑或 (OR) |
选择策略:何时选用何种命令?
- Bash 环境推荐:
[[ ... ]]
它提供卓越的功能、安全性及可读性。在处理复杂逻辑和正则表达式匹配时,它是您的不二之选。 - 兼容性考量:
test
或[
若脚本需在非 Bash 的 POSIX Shell 环境中运行,或在老旧系统上确保最大兼容性,则test
或[
是更稳妥的选择。此时,变量引用和操作符转义至关重要。
熟练驾驭 test
、[
和 [[
,是成为一名出色 Shell 脚本工程师的必经之路。它们是您脚本实现自动化、智能化与健壮性的关键所在。