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

我怎么能把我的Bash脚本收到的所有参数传递给abc()?参数的数量是可变的,所以我不能像这样硬编码传入的参数:

abc $1 $2 $3 $4

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


当前回答

ABC“$@”通常是正确答案。 但是我试图将一个参数传递给一个su命令,再多的引用也不能阻止错误su: unrecognized选项“——myoption”。真正对我有用的是将所有参数作为单个字符串传递:

abc "$*"

我的具体案例(我确定其他人需要这个)在我的.bashrc中

# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}

其他回答

ABC“$@”通常是正确答案。 但是我试图将一个参数传递给一个su命令,再多的引用也不能阻止错误su: unrecognized选项“——myoption”。真正对我有用的是将所有参数作为单个字符串传递:

abc "$*"

我的具体案例(我确定其他人需要这个)在我的.bashrc中

# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}

$@变量展开为所有用空格分隔的命令行参数。这里有一个例子。

abc "$@"

当使用$@时,你应该(几乎)总是把它放在双引号中,以避免错误解析包含空格或通配符的参数(见下文)。这适用于多个参数。它还可以移植到所有posix兼容的shell。

同样值得注意的是$0(通常是脚本的名称或路径)不在$@中。

Bash参考手册特殊参数部分说$@扩展为从1开始的位置参数。当展开出现在双引号内时,每个参数展开为一个单独的单词。即“$@”相当于“$1”“$2”“$3”....

传递一些参数:

If you want to pass all but the first arguments, you can first use shift to "consume" the first argument and then pass "$@" to pass the remaining arguments to another command. In Bash (and zsh and ksh, but not in plain POSIX shells like dash), you can do this without messing with the argument list using a variant of array slicing: "${@:3}" will get you the arguments starting with "$3". "${@:3:4}" will get you up to four arguments starting at "$3" (i.e. "$3" "$4" "$5" "$6"), if that many arguments were passed.

你可能不想做的事情:

"$*"将所有参数组合成一个字符串(用空格或$IFS的第一个字符分隔)。这失去了参数内空格和参数间空格之间的区别,所以通常是一个坏主意。尽管打印参数可能没问题,例如echo "$*",前提是你不关心在区别之间保留空格。

将参数赋值给一个常规变量(如args="$@")会像"$*"一样将所有参数混在一起。如果你想将参数存储在一个变量中,使用一个带有args=("$@")的数组(括号使它成为一个数组),然后引用它们,例如:" $ {args[0]}”等。请注意,在Bash和ksh中,数组索引从0开始,因此$1将在args[0]中开始,而zsh则从1开始,因此$1将在args[1]中开始。更基本的shell,比如dash,根本没有数组。

去掉双引号,使用$@或$*,将尝试将每个参数分割为单独的单词(基于空格或$IFS中的任何内容),并尝试将任何看起来像文件名通配符的内容扩展为匹配的文件名列表。这可能会产生非常奇怪的效果,应该尽量避免。(除了在zsh中,默认情况下不会发生这种展开。)

值得一提的是,您可以使用此语法指定参数范围。

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

我没看到有人提到过。

abc "$@"

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

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

abc "$@"