代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

如何将传递给bash脚本的所有参数传递给我的函数?

  •  475
  • devoured elysium  · 技术社区  · 14 年前

    假设我定义了一个 function abc() 它将处理与分析传递给脚本的参数相关的逻辑。

    如何将bash脚本收到的所有参数传递给它?参数的数目是可变的,所以我不能像这样硬编码传递的参数:

    abc $1 $2 $3 $4
    

    . 更好的是,我的函数有没有办法访问脚本参数的变量?

    7 回复  |  直到 6 年前
        1
  •  1153
  •   Gordon Davisson    4 年前

    这个 $@ 变量扩展到所有由空格分隔的命令行参数。下面是一个例子。

    abc "$@"
    

    使用时 $@ ,您应该(几乎)总是将它放在双引号中,以避免错误地插入包含空格或通配符的参数(见下文)。这适用于多个参数。它还可移植到所有符合POSIX的shell。

    $0 (通常脚本的名称或路径)不在 $@ .

    Bash Reference Manual Special Parameters Section 他说 $@ 从一开始展开到位置参数。当展开发生在双引号内时,每个参数展开为一个单独的字。就是这样 "$@" 相当于 "$1" "$2" "$3"...

    经过 一些 论据:

    参数,可以先使用 shift "$@" 将其余参数传递给另一个命令。在bash中(以及zsh和ksh,但不是在像dash这样的普通POSIX shell中),您可以使用数组切片的一种变体来实现这一点,而不会弄乱参数列表: "${@:3}" 会让你从 "$3" . "${@:3:4}" "$3" (即。 "$3" "$4" "$5" "$6" ),如果传递了那么多参数。

    "$*" 将所有参数组合在一个字符串中(以空格分隔,或以任何字符开头) $IFS 是)。这就放宽了空间之间的区别 在内部 论元与空间 争论,所以通常是个坏主意。尽管可以打印参数,例如。 echo "$*" ,前提是您不关心保留区分内/之间的空间。

    将参数赋给正则变量(如 args="$@" )把所有的论点混合在一起就像 做。如果要将参数存储在变量中,请使用带 args=("$@") (括号使其成为一个数组),然后引用它们作为。 "${args[0]}" $1 args[0]

    去掉双引号 $* ,将尝试将每个参数拆分为单独的单词(基于空格或其他任何字符) $如果 ),并尝试将任何看起来像文件名通配符的内容扩展到匹配文件名的列表中。这可能会产生非常奇怪的效果,而且几乎总是应该避免的。

        2
  •  153
  •   hajamie    12 年前

    我需要一个变体,我希望它对其他人有用:

    function diffs() {
            diff "${@:3}" <(sort "$1") <(sort "$2")
    }
    

    这个 "${@:3}" part表示数组中从3开始的所有成员。因此,此函数通过将前两个参数通过sort传递给diff,然后将所有其他参数传递给diff来实现排序的diff,因此可以类似于diff调用它:

    diffs file1 file2 [other diff args, e.g. -y]
    
        3
  •  56
  •   Daniel Böhmer Ali Shaukat    8 年前

    $@ 变量,它扩展到所有由空格分隔的命令行参数。

    abc "$@"
    
        4
  •  51
  •   Giuseppe Cardone    6 年前

    下面是一个简单的脚本:

    #!/bin/bash
    
    args=("$@")
    
    echo Number of arguments: $#
    echo 1st argument: ${args[0]}
    echo 2nd argument: ${args[1]}
    

    $# 脚本接收的参数数。我发现使用数组更容易访问它们: args=("$@") 行将所有参数放入 args ${args[index]} .

        5
  •  40
  •   robstarbuck    8 年前

    function example() {
        echo "line1 ${@:1:1}"; #First argument
        echo "line2 ${@:2:1}"; #Second argument
        echo "line3 ${@:3}"; #Third argument onwards
    }
    

    我没看到有人提起过。

        6
  •  23
  •   andrew lorien    6 年前

    abc“$@”通常是正确答案。 su: unrecognized option '--myoption' . 实际上对我有效的是将所有参数作为一个字符串传递:

    abc "$*"
    

    # run all aws commands as Jenkins user
    aws ()
    {
        sudo su jenkins -c "aws $*"
    }
    
        7
  •  20
  •   Vivien Barousse    10 年前
    abc "$@"
    

    $@ 表示给定给bash脚本的所有参数。