在 Shell 脚本中,${}
(花括号)用于明确界定变量名的边界,避免歧义,并支持更高级的变量操作。以下是详细解释:
name="Alice"
echo "Hello $name!" # ✅ 正确 → "Hello Alice!"
echo "Hello $name_smith" # ❌ 错误!Shell 会尝试解析 `$name_smith`(而非 `$name`)
• 因为 Shell 默认会将 _
视为变量名的一部分,导致找不到 $name_smith
变量。
${}
划定范围echo "Hello ${name}_smith" # ✅ 正确 → "Hello Alice_smith"
此时 Shell 明确知道变量是 name
,后续的 _smith
是普通文本。
${}
不仅能划定边界,还支持多种字符串操作:
# 如果变量未定义,使用默认值
echo ${var:-"默认值"}
# 示例:
unset username
echo "用户: ${username:-"游客"}" # 输出 "用户: 游客"
path="/home/user/docs/file.txt"
# 截取目录部分(从左删除最短匹配)
echo ${path%/*} # 输出 "/home/user/docs"
# 截取文件名(从右删除最长匹配)
echo ${path##*/} # 输出 "file.txt"
# 截取文件扩展名
echo ${path##*.} # 输出 "txt"
str="Hello World"
# 替换第一个匹配
echo ${str/World/Shell} # 输出 "Hello Shell"
# 替换所有匹配
echo ${str//l/L} # 输出 "HeLLo WorLd"
str="Shell"
echo ${#str} # 输出 5(字符数)
{}
?file="data"
echo "$file_backup" # ❌ 尝试解析 `file_backup`(变量不存在)
echo "${file}_backup" # ✅ 输出 "data_backup"
arr=("A" "B" "C")
echo "$arr[1]" # ❌ 错误!输出 "A[1]"(未正确解析数组)
echo "${arr[1]}" # ✅ 正确 → 输出 "B"
$var
vs ${var}
场景 | $var |
${var} |
说明 |
---|---|---|---|
简单变量引用 | ✅ echo $var |
✅ echo ${var} |
等效 |
拼接文本 | ❌ echo $varX |
✅ echo ${var}X |
避免歧义 |
数组引用 | ❌ $arr[0] |
✅ ${arr[0]} |
必须用 ${} |
字符串操作 | ❌ 不支持 | ✅ ${var//old/new} |
仅 ${} 支持 |
始终用 ${}
:
即使简单变量也推荐 ${var}
,提高可读性和一致性。
# 推荐
echo "${name}"
# 不推荐(除非确定无歧义)
echo "$name"
复杂操作必须用 ${}
:
如字符串替换、默认值设置等。
在双引号内使用:
避免空格或特殊字符引发问题:
echo "路径: ${path}"
• ${}
的核心作用:划定变量边界,避免歧义。
• 额外能力:支持字符串操作、默认值、数组等高级功能。
• 最佳实践:始终使用 ${}
,让代码更清晰、更安全。
通过 ${}
,Shell 脚本的变量处理变得更强大和灵活!