在 Bash 脚本中,${}
和 $()
是两种完全不同的语法结构,用途截然不同:
${}
- 变量扩展(Variable Expansion)用途:用于明确界定变量名边界或进行高级变量操作。
常见用法:
var="world"
echo "Hello ${var}" # 输出: Hello world
高级功能:
- 避免歧义(当变量名后紧跟其他字符时):
bash
fruit="apple"
echo "I have ${fruit}s" # 正确显示: I have apples
变量默认值:
echo ${name:-"Guest"} # 如果$name未设置,输出"Guest"
字符串操作:
str="hello"
echo ${str:1:3} # 输出: ell (子字符串)
echo ${str^^} # 输出: HELLO (转为大写)
$()
- 命令替换(Command Substitution)用途:执行命令并捕获其输出。
示例:
echo "Today is $(date)" # 输出: Today is [当前日期时间]
files=$(ls) # 将ls命令结果存入变量
等价的旧式语法:反引号 `
echo `date` # 不推荐,嵌套时易出错
特性 | ${} |
$() |
---|---|---|
用途 | 变量操作 | 命令替换 |
内容处理 | 操作现有变量值 | 执行新命令 |
嵌套能力 | 可以嵌套 ${var:-${DEFAULT}} |
可以嵌套 $(cmd $(subcmd)) |
典型场景 | 字符串处理、变量默认值 | 获取命令输出 |
# 错误尝试(混淆两者):
echo ${ls} # 尝试把ls当作变量名,输出空
echo $(date) # 正确执行date命令
# 组合使用(正确示范):
file_count=$(ls | wc -l)
echo "There are ${file_count} files"
(( ))
: 算术运算[ ]
或 [[ ]]
: 条件测试理解这些符号的区别是编写健壮Bash脚本的基础。当不确定时,可以通过man bash
查看"SHELL GRAMMAR"部分获取权威解释。