在Shell脚本中,$@ 是一个特殊的参数变量,它表示所有传递给脚本或函数的命令行参数,具有以下特点和用途:

基本特点

  • 包含所有参数$@ 会将所有的命令行参数作为一个整体,以单独的字符串形式保存。如果有多个参数,它们之间会保留输入时的空格等分隔符。

  • 保留原始格式:与 $* 不同,$@ 在处理包含空格或特殊字符的参数时,会将每个参数作为一个独立的实体来对待,能够更准确地传递和处理参数。

常见用途

  • 遍历参数:在脚本中可以通过循环结构来遍历 $@ 中的每个参数,对每个参数进行相同或不同的操作。例如:

    #!/bin/bash
    for arg in "$@"
    do
        echo "当前参数是:$arg"
    done

  • 传递参数给其他命令:可以将 $@ 作为参数传递给其他命令,以便在其他命令中使用这些参数。例如:

    #!/bin/bash
    cp "$@" /backup
    这个脚本可以将所有传递给它的文件参数复制到 /backup 目录下。

  • 与其他变量组合使用:可以与其他变量和字符串进行组合,构建更复杂的命令或参数列表。例如:

    #!/bin/bash
    prefix="file_"
    for arg in "$@"
    do
        new_arg="$prefix$arg"
        echo "处理后的参数:$new_arg"
    done

与$*的区别

  • 展开方式$* 将所有参数作为一个整体字符串展开,参数之间以第一个参数中的空格作为分隔符;而 $@ 将每个参数作为独立的字符串展开,保留了参数之间的空格等分隔符。

  • 循环遍历差异:在循环中使用时,for arg in "$*" 会将所有参数作为一个整体进行一次循环;而 for arg in "$@" 会对每个参数分别进行一次循环。