在 Shell 脚本中,{}
是一个非常重要的符号,具有多种用途。它的核心作用包括 变量替换、命令分组、范围扩展 和 代码块定义。
一、变量替换(${})
{}
用于界定变量名的边界,并支持字符串操作。
1. 明确变量边界
- 作用:避免变量名与后续字符混淆。
- 示例:
name="Alice" echo "Hello ${name}_smith" # 输出 "Hello Alice_smith" echo "Hello $name_smith" # 错误!尝试解析变量 $name_smith(未定义)
2. 字符串操作
- 语法:
${variable:操作}
,支持以下操作:- 默认值:
echo ${var:-"default"} # 如果 var 未定义,使用 "default"
- 字符串截取:
path="/home/user/docs/file.txt" echo ${path%/*} # 输出 "/home/user/docs"(从右删除最短匹配) echo ${path##*/} # 输出 "file.txt"(从左删除最长匹配)
- 字符串替换:
str="Hello World" echo ${str/World/Shell} # 替换第一个匹配项 → "Hello Shell" echo ${str//l/L} # 替换所有匹配项 → "HeLLo WorLd"
- 获取长度:
str="Shell" echo ${#str} # 输出 5(字符数)
- 默认值:
3. 数组操作
- 语法:
${array[index]}
,访问数组元素。 - 示例:
arr=("A" "B" "C") echo ${arr[1]} # 输出 "B"
二、命令分组({ } vs ( ))
{}
和 ()
都可以分组命令,但执行环境不同。
1. 使用 {}
的命令分组
- 作用:在 当前 Shell 中执行命令,变量修改会影响外部环境。
- 语法:
{ command1 command2 }
- 示例:
var="initial" { var="modified" echo "Inside: $var" } echo "Outside: $var" # 输出 "Outside: modified"
2. 使用 ()
的命令分组
- 作用:在 子 Shell 中执行命令,变量修改不会影响外部环境。
- 语法:
( command1 command2 )
- 示例:
var="initial" ( var="modified" echo "Inside: $var" ) echo "Outside: $var" # 输出 "Outside: initial"
3. 区别总结
特性 | {} | () |
---|---|---|
执行环境 | 当前 Shell | 子 Shell |
变量修改 | 影响外部 | 不影响外部 |
性能 | 更高效 | 稍慢(创建子进程) |
三、范围扩展({start…end})
{}
用于生成序列(数字或字母),常用于批量创建文件或目录。
1. 数字范围
- 语法:
{start..end}
- 示例:
touch file{1..5}.txt # 创建 file1.txt, file2.txt, ..., file5.txt
2. 字母范围
- 语法:
{a..z}
- 示例:
echo {a..c} # 输出 "a b c"
3. 嵌套范围
- 语法:
{x,y}{1,2}
- 示例:
echo {A,B}{1,2} # 输出 "A1 A2 B1 B2"
四、代码块定义({ })
{}
可以定义匿名函数或代码块,用于组织脚本逻辑。
1. 匿名函数
- 语法:
{ # 代码块 }
- 示例:
{ echo "Start" sleep 1 echo "End" }
2. 与 if
结合
- 语法:
if { # 条件代码 }; then # 操作 fi
- 示例:
if { [ -f "file.txt" ] && echo "File exists" }; then echo "Condition met" fi
五、特殊用法
1. 参数扩展
- 语法:
${parameter:+word}
,用于条件传递参数。 - 示例:
X_OPTION="-x" display_param_info a ${X_OPTION:+$X_OPTION} b c d # 如果 X_OPTION 非空,则传递 "-x",否则跳过
2. 大括号展开(通配符)
- 语法:
{pattern}
- 示例:
echo {a,b,c}.txt # 输出 "a.txt b.txt c.txt"
六、注意事项
-
空格问题:
- 在
{}
内部,命令之间需要用;
分隔,且最后一个命令后必须有;
。 - 示例:
{ echo "Line 1"; echo "Line 2"; }
- 在
-
避免与
[ ]
混淆:[ ]
是test
命令的别名,用于条件判断。[[ ]]
是 Bash 的增强版条件判断。- 示例:
if [ "$var" = "value" ]; then ... fi # 使用 [ ] if [[ "$var" == "value" ]]; then ... fi # 使用 [[ ]]
-
子 Shell 与当前 Shell 的区别:
- 子 Shell 中的变量修改不会影响外部环境。
- 示例:
var="initial" ( var="modified" echo "Inside: $var" ) echo "Outside: $var" # 输出 "Outside: initial"