大括号${var}的核心作用是明确变量名边界,防止后续字符引发解析错误;必须使用场景包括变量后接字母数字下划线、路径拼接、数组索引等,还支持截取、默认值、删除前缀、间接引用等扩展功能。

在 Linux Shell 脚本中,用大括号 ${var} 包裹变量名,核心作用是**明确变量名的起止位置**,避免因后续字符导致解释器误判边界。这不是可选项,而是关键规范——尤其当变量紧挨着字母、数字、下划线或特殊符号时。
什么情况下必须用大括号
当变量名后面紧跟其他字符,shell 无法自动断句,就会出错或取空值:
-
name="log"; echo "$name_file"→ 输出空(shell 尝试找变量name_file,不存在) - 正确写法:
echo "${name}_file"→ 输出log_file - 路径拼接:
dir="/tmp"; path="${dir}/data.txt"(不用大括号会变成$dir/data.txt,/data.txt被当作变量名一部分) - 数组索引:
arr=(a b c); echo "item:${arr[0]}"必须写成${arr[0]},否则$arr[0]只取首元素且[0]被当字面量输出
大括号还能做什么边界处理
它不只是防歧义,还支持更精细的变量操作:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 截取子串:
str="hello123"; echo "${str:0:5}"→hello - 默认值替换:
echo "${USER:-unknown}"(USER未定义或为空时返回unknown) - 删除前缀:
path="/home/user/file"; echo "${path#/home/}"→user/file - 嵌套变量引用:
key="name"; value="Alice"; echo "${!key}"→Alice(间接引用)
推荐写法:统一加花括号
即使当前没歧义,也建议所有变量都用 ${var} 形式:
- 提升可读性,一眼识别变量范围
- 避免未来修改脚本时(比如追加字符)意外引入 bug
- 兼容所有 shell(如 dash、ash),而
$var在某些场景下行为不一致 - 与数组、参数扩展(如
${10})、字符串操作语法保持统一
注意别和其它括号混淆
大括号 {} 在 shell 中有多种用途,变量扩展只是其一:
-
${var}:变量扩展(本文重点) -
{cmd1; cmd2;}:命令块(注意分号和空格) -
{1..5}:序列展开 -
$(cmd):命令替换(圆括号,不是花括号) -
$((expr)):算术扩展(双圆括号)
写变量时只用 ${...},别漏掉开头的 $,也别错写成 $(...) 或 $((...))。

















