1. 圆括号比较:()
vs (())
()
单圆括号:
- 主要用途:
# 1. 创建子shell环境 (cd /tmp; ls) # 不影响当前目录 # 2. 命令替换 result=$(ls) version=$(uname -r)
(())
双圆括号:
- 主要用途:算术运算
# 1. 基本运算 ((a=1+2)) ((b=a*3)) # 2. 自增自减 ((c++)) ((d--)) # 3. 条件判断 if ((a > b))
2. 方括号比较:[]
vs [[]]
[]
单方括号:
- 主要用途:测试命令(等同于test命令)
# 1. 数值比较
[ "$a" -eq "$b" ]
[ "$a" -lt "$b" ]
# 2. 字符串比较
[ "$str" = "test" ]
[ -n "$str" ]
# 3. 文件测试
[ -f "$file" ]
[ -d "$dir" ]
[[]]
双方括号:
- 主要用途:bash的条件测试增强版
# 1. 正则匹配
[[ $str =~ ^[0-9]+$ ]]
# 2. 通配符
[[ $file == *.txt ]]
# 3. 逻辑运算
[[ $a -eq 1 && $b -eq 2 ]]
3. 主要区别对照表
特性 | () | (()) | [] | [[]] |
---|---|---|---|---|
主要用途 | 子shell/命令替换 | 算术运算 | 条件测试 | 增强条件测试 |
变量引用 | 需要$ | 不需要$ | 需要$ | 不需要$ |
空格处理 | 不敏感 | 不敏感 | 敏感 | 不敏感 |
正则支持 | 否 | 否 | 否 | 是 |
通配符 | 否 | 否 | 否 | 是 |
4. 使用示例对照
# 1. 变量处理
var="test string"
(echo $var) # 子shell中执行
((a = 5)) # 算术赋值
[ "$var" = "test" ] # 需要引号
[[ $var = "test" ]] # 不需要引号
# 2. 条件判断
# 算术比较
((5 > 3)) # 算术比较
[ "$a" -gt "$b" ] # 数值比较
[[ $a -gt $b ]] # 增强数值比较
# 3. 字符串操作
[ "$str1" = "$str2" ] # 字符串相等
[[ $str1 == $str2 ]] # 字符串相等(更灵活)
# 4. 逻辑运算
[ $a -eq 1 -a $b -eq 2 ] # AND运算
[[ $a -eq 1 && $b -eq 2 ]] # AND运算(更直观)
5. 最佳实践建议
-
使用
(())
当:- 需要进行算术运算
- 需要自增自减操作
-
使用
()
当:- 需要在子shell中执行命令
- 需要命令替换
-
使用
[[]]
当:- 进行字符串或文件测试
- 需要使用正则表达式
- 需要使用通配符
- 在bash脚本中
-
使用 ]` 当:
- 需要POSIX兼容性
- 在非bash shell中运行脚本