Bash 中 `${}` 和 `$()` 的区别

422 阅读1分钟

Bash 中 ${}$() 的区别

在 Bash 脚本中,${}$() 是两种不同的表达式,分别用于变量操作和命令替换。以下是它们的详细区别和用法。


1. ${}:变量替换

${} 用于对变量进行引用和操作。其主要用途包括:

1.1 基础用法

  • 引用变量值:

    name="Bash"
    echo "Hello, ${name}!"  # 输出:Hello, Bash!
    
  • 如果变量名后直接跟其他字符,${} 是必要的:

    file="example"
    echo "${file}.txt"      # 输出:example.txt
    echo "$file.txt"        # 错误,会查找名为 file.txt 的变量
    

1.2 高级用法

  • 默认值和替代值:

    echo "${name:-Default}" # 如果 name 未定义或为空,返回 Default
    
  • 字符串操作:

    str="hello_world"
    echo "${str:0:5}"       # 提取子串,输出:hello
    echo "${str//_/ }"      # 替换字符,输出:hello world
    
  • 判断变量是否为空:

    var=""
    echo "${var:?Variable is unset or empty}"  # 如果变量为空,抛出错误
    

2. $():命令替换

$() 用于命令替换,即将命令的输出捕获并用于后续操作。其功能类似于反引号 `command`,但更现代和清晰。

2.1 基础用法

  • 捕获命令输出:

    today=$(date)
    echo "Today is: $today"
    
  • 嵌套命令替换:

    result=$(echo $(date))
    echo "Nested result: $result"
    

2.2 与反引号的区别

  • 反引号难以处理嵌套命令,而 $() 更加直观:
    # 使用反引号的嵌套
    nested=`echo \`date\``   # 不直观,容易出错
    
    # 使用 $() 的嵌套
    nested=$(echo $(date))   # 清晰易读
    

3. ${}$() 的区别总结

功能${}$()
作用引用变量和操作变量捕获命令的输出
返回值变量值或经过操作后的值命令执行结果
适用场景操作变量(如字符串替换)执行命令并捕获其输出

4. Bash 中的其他特性

4.1 条件判断

  • 使用 if 判断文件或变量状态:
    if [ -f "file.txt" ]; then
        echo "File exists"
    else
        echo "File does not exist"
    fi
    

4.2 循环

  • for 循环:

    for i in {1..5}; do
        echo "Number: $i"
    done
    
  • while 循环:

    count=1
    while [ $count -le 5 ]; do
        echo "Count: $count"
        count=$((count + 1))
    done
    

4.3 函数

  • 定义和调用函数:

    my_function() {
        echo "This is a function"
    }
    my_function
    
  • 函数参数:

    greet() {
        echo "Hello, $1"
    }
    greet "World"  # 输出:Hello, World
    

4.4 数值运算

  • 使用 $(( )) 进行整数运算:
    result=$((5 + 3))
    echo "5 + 3 = $result"
    

4.5 数组

  • 定义数组:

    arr=("one" "two" "three")
    echo "${arr[1]}"         # 输出:two
    
  • 遍历数组:

    for item in "${arr[@]}"; do
        echo $item
    done
    

4.6 扩展匹配

  • 使用通配符:
    files=(*.txt)
    echo "Text files: ${files[@]}"
    

5. 小结

  • ${} 用于变量替换和操作,适合处理字符串、默认值等变量操作。
  • $() 用于命令替换,适合捕获命令输出。
  • Bash 提供了强大的条件判断、循环、函数和数组操作功能,可以灵活实现各种自动化任务。

了解这些特性后,可以更高效地编写脚本,提高开发效率和代码可读性!