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

How to pass all arguments passed to my bash script to a function of mine?

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

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

1
abc $1 $2 $3 $4

编辑。更好的是,我的函数是否有任何方法可以访问脚本参数的变量?


pet peeve:当使用$@时,您应该(几乎)总是将其放在双引号中,以避免错误地将带有空格的论点放在引号中:

1
abc"$@"


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

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

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

1
diffs file1 file2 [other diff args, e.g. -y]


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

1
abc"$@"

下面是一个简单的脚本:

1
2
3
4
5
6
7
#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}

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


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

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

我没看到提到过。


1
abc"$@"

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


ABC"$@"通常是正确的答案。但是我试图将一个参数传递给su命令,任何引用都不能阻止错误su: unrecognized option '--myoption'。实际上对我有用的是将所有参数作为一个字符串传递:

1
abc"@*"

我的确切情况(我确信还有人需要这个)在我的.bashrc中。

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