linux括号的各种用法,详细解释,并分类对比
Linux Shell 括号用法完全指南:分类详解与对比
一、括号类型总览
括号类型
语法示例
主要用途
执行环境
是否创建子shell
兼容性
( ) 圆括号
(cmd1; cmd2)
子shell执行、数组、算术运算
子shell
是
高
{ } 花括号
{ cmd1; cmd2; }
命令组、序列扩展
当前shell
否
高
[ ] 单中括号
[ -f file ]
条件测试(test命令)
当前shell
否
高
[[ ]] 双中括号
[[ $var == pattern ]]
增强条件测试
当前shell
否
Bash
(( )) 双圆括号
(( a++ ))
算术运算
当前shell
否
Bash
二、圆括号 ( ) 详解
1. 子shell执行
(cd /tmp; ls) # 在子shell中执行
pwd # 仍显示原目录
特点:
创建新进程执行
环境变量隔离
性能开销较大
2. 数组定义
colors=(red green blue)
echo ${colors[1]} # 输出green
3. 算术运算(两种形式)
echo $((3 + 5 * 2)) # 输出13
((count++)) # 自增操作
4. 进程替换
diff <(ls dir1) <(ls dir2) # 比较两个目录
三、花括号 { } 详解
1. 当前shell命令组
{ var=123; echo $var; } # 变量修改会影响当前shell
语法要求:
左括号后必须有空格
右括号前必须有分号
2. 序列扩展
echo {1..5} # 1 2 3 4 5
echo {a..e} # a b c d e
echo {01..10} # 01 02...10
echo {1..10..2} # 1 3 5 7 9
3. 文件名批量操作
cp file.{txt,bak} # 等价于 cp file.txt file.bak
touch report_{1..3}.txt # 创建3个文件
四、单中括号 [ ] 详解
1. 条件测试
[ -f file.txt ] && echo "文件存在"
常用测试符:
-e 存在
-d 是目录
-s 非空文件
-nt 比...新
2. 字符串比较
[ "$str" = "value" ] # 必须加引号
[ "$str" != "" ] # 非空判断
3. 数值比较
[ "$num" -gt 10 ] # 使用-gt而不是>
五、双中括号 [[ ]] 详解
1. 增强测试
[[ $var == *.txt ]] # 模式匹配
[[ $str =~ ^[0-9]+$ ]] # 正则匹配
2. 逻辑运算
[[ -f file && -r file ]] # 使用&&而不是-a
六、双圆括号 (( )) 详解
1. 算术运算
(( total = (a + b) * c ))
(( count++ ))
2. 数值比较
if (( a > b )); then
echo "a大于b"
fi
七、关键对比表
条件测试对比:[ ] vs [[ ]]
特性
[ ]
[[ ]]
实现
test命令
bash关键字
模式匹配
不支持
支持(==)
正则匹配
不支持
支持(=~)
逻辑运算符
-a/-o
&&/||
变量引号
必须
可选
执行效率
较低
较高
命令执行对比:( ) vs
特性
( )
{ }
执行环境
子shell
当前shell
变量隔离
是
否
性能
较低
较高
语法要求
无特殊要求
需要空格和分号
八、高级用法示例
1. 安全文件处理
[[ -f "$file" && ( "$count" -gt 10 || "$force" == "yes" ) ]] && process_file
2. 批量目录创建
mkdir -p /data/{logs,backup}/{2020..2023}_{Q1..Q4}
3. 复杂算术运算
(( result = (a * b) + (c ** d) ))
九、最佳实践建议
条件测试:优先使用 [[ ]],需要兼容POSIX时用 [ ]
算术运算:总是使用 (( )) 和 $(( ))
命令分组:需要变量隔离用 ( ),否则用 { }
变量安全:在 [ ] 中始终加引号
复杂逻辑:适当使用括号分组提高可读性
掌握这些括号的区别和适用场景,可以显著提高Shell脚本的健壮性和执行效率。