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脚本的健壮性和执行效率。