解释Bash $\* 和 $@ 有什么区别 ?

参考回答

在Bash中,$*$@ 都表示传递给脚本或函数的所有参数,但它们的行为在处理带引号的参数时有所不同。

  1. $*
    • $* 会将所有的位置参数作为一个单一的字符串返回,参数之间用 第一个字符(通常是空格) 分隔。
    • 如果用双引号包围 $*,它会将所有参数作为一个整体,以 第一个分隔符(通常是空格) 拼接在一起。

    示例:

    set -- "Hello world" "Bash script"
    echo "$*"  # 输出:Hello world Bash script
    
    Bash

    这里,$* 将两个参数 "Hello world""Bash script" 视为一个单一的字符串,参数之间用空格连接。

  2. $@

    • $@ 会将每个位置参数作为单独的字符串返回,保持原有的分隔。如果用双引号包围 $@,每个参数会被当作一个独立的单元,而不是一个合并的字符串。

    示例:

    set -- "Hello world" "Bash script"
    echo "$@"  # 输出:Hello world Bash script
    
    Bash

    当用双引号包围 $@ 时,每个参数会被视为一个单独的字符串:

    for arg in "@"; do
       echo "arg"
    done
    
    Bash

    输出:

    Hello world
    Bash script
    

    在这个例子中,$@ 将每个参数保持为独立的字符串。

详细讲解与拓展

  1. 区别:

    • $* 会把所有参数拼接成一个单一的字符串,参数之间用 第一个字符(默认是空格) 连接。如果你在双引号中使用 $*,它会将所有的参数连接成一个单一的字符串。
    • $@ 将每个参数作为独立的字符串处理。特别是,当你将 $@ 包装在双引号中时,它会将每个参数视为一个单独的整体,而不是将它们拼接成一个长字符串。
  2. 双引号的影响:
    这是 $*$@ 最关键的区别之一。通常,当你在脚本中处理带空格的参数时,双引号的使用可以保持参数的完整性。

    $* 示例(不加引号):

    set -- "Hello world" "Bash script"
    echo $*  # 输出:Hello world Bash script
    
    Bash

    这里,$* 会将 "Hello world""Bash script" 当作两个独立的参数,但它会用空格连接它们。

    $@ 示例(不加引号):

    set -- "Hello world" "Bash script"
    echo $@  # 输出:Hello world Bash script
    
    Bash

    "$@""$*" 的行为就有所不同:

    "$*" 示例:

    set -- "Hello world" "Bash script"
    echo "$*"  # 输出:Hello world Bash script
    
    Bash

    "$@" 示例:

    set -- "Hello world" "Bash script"
    for arg in "@"; do
       echo "arg"
    done
    
    Bash

    输出:

    Hello world
    Bash script
    

    这里,"$@" 保持每个参数的完整性,空格不会导致它们合并成一个字符串。

  3. 使用场景:

    • $* 更常用于拼接所有参数为一个字符串,例如将所有命令行参数传递给另一个程序或脚本时:
      some_command $*
      
      Bash
    • $@ 更适合用于循环或处理每个单独的参数,特别是当每个参数可能包含空格时:
      for arg in "@"; do
       echo "arg"
      done
      
      Bash
  4. 实际使用中的选择:
    • 如果你处理的参数中可能包含空格,且需要保持每个参数的独立性,最好使用 "$@"
    • 如果你只是需要将所有参数合并成一个字符串,并且不关心空格问题,可以使用 $*

总结

  • $*:将所有参数作为一个字符串拼接,用空格分隔。如果用双引号包裹,所有参数会被合并为一个字符串。
  • $@:将每个参数作为独立的字符串返回。如果用双引号包裹,保持每个参数的独立性,并且它们不会被合并。

当需要处理包含空格的参数时,使用 "$@" 是最安全的选择。

发表评论

后才能评论