插件窝 干货文章 Bash 中的 ${} 和 $() 有什么区别

Bash 中的 ${} 和 $() 有什么区别

变量 输出 Bash echo 484    来源:    2025-04-13

在 Bash 脚本中,${}$() 是两种完全不同的语法结构,用途截然不同:

1. ${} - 变量扩展(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 (转为大写)
    

2. $() - 命令替换(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"部分获取权威解释。