在 Bash 中,if
条件判断可以使用多种不同的括号形式,每种形式有不同的作用和语法规则:
1. if [ ]
– 传统的 test 命令
[ ]
是test
命令的另一种形式([
是一个内置命令,需要以]
结尾)- 兼容性最好,可在所有 POSIX shell 中使用
- 需要严格的语法(如变量引用要加引号,运算符两边要有空格)
示例:
if [ "$var" -eq 10 ]; then
echo "var is 10"
fi
if [ -f "file.txt" ]; then
echo "file exists"
fi
特点:
– 不支持 &&
和 ||
(要用 -a
和 -o
)
– 不支持正则匹配
– 字符串比较用 =
或 !=
– 数值比较用 -eq
, -ne
, -lt
, -gt
等
2. if [[ ]]
– Bash 增强版条件表达式
[[ ]]
是 Bash 的关键字(不是命令),提供更多功能- 只在 Bash 和其他现代 shell(如 Zsh、Ksh)中可用
- 语法更灵活,更安全(不需要严格引用变量)
示例:
if [[ $var == 10 ]]; then
echo "var is 10"
fi
if [[ "$str" == *.txt ]]; then
echo "str ends with .txt"
fi
if [[ $var -gt 5 && $var -lt 15 ]]; then
echo "var is between 5 and 15"
fi
特点:
– 支持 &&
和 ||
逻辑运算符
– 支持正则匹配 =~
– 支持模式匹配 ==
(如 *.txt
)
– 字符串比较可以用 ==
或 !=
– 不需要对变量严格加引号(但仍建议加)
3. if (( ))
– 算术运算
(( ))
用于算术运算和比较- 如果算术表达式的结果非零(true),则返回 0(成功)
- 只在 Bash 和其他现代 shell 中可用
示例:
if (( $var == 10 )); then
echo "var is 10"
fi
if (( var > 5 && var < 15 )); then
echo "var is between 5 and 15"
fi
if (( count++ > 10 )); then
echo "count is now greater than 10"
fi
特点:
– 使用类似 C 语言的算术运算符(==
, !=
, >
, <
, >=
, <=
)
– 支持 ++
, --
, +=
等自增/自减操作
– 变量可以不加 $
前缀(但建议加上以提高可读性)
– 不支持字符串操作,纯数值计算
总结比较
特性 | [ ] (test) |
[[ ]] |
(( )) |
---|---|---|---|
用途 | 基本条件测试 | 增强条件测试 | 算术运算 |
逻辑运算符 | -a , -o |
&& , ` |
|
字符串比较 | = , != |
== , != |
不支持 |
数值比较 | -eq , -ne |
-eq , -ne |
== , != , > , < |
模式匹配 | 不支持 | 支持 (== , =~ ) |
不支持 |
变量引用 | 必须加引号 | 可不加引号 | 可不加 $ |
POSIX 兼容 | 是 | 否 | 否 |
推荐用法
- 需要兼容 POSIX shell(如
/bin/sh
)时用[ ]
- 在 Bash 脚本中优先使用
[[ ]]
进行条件测试 - 进行算术比较时用
(( ))
- 避免混合使用这些语法(比如不要在
[[ ]]
中使用-eq
)