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

dev*_*ium 564 bash function parameter-passing

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

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

abc $1 $2 $3 $4
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*son 904

宠儿:在使用时$@,你应该(几乎)总是把它放在双引号中,以避免错误地使用空格中的参数:

abc "$@"
Run Code Online (Sandbox Code Playgroud)

  • 详细了解为什么在这里使用双 " 很重要:/sf/answers/337724621/ (3认同)
  • 额外注释:“$*”将是单个字符串,“IFS”的第一个字符是连接元素。 (2认同)

haj*_*mie 139

我需要对此进行修改,我希望这对其他人有用:

function diffs() {
        diff "${@:3}" <(sort "$1") <(sort "$2")
}
Run Code Online (Sandbox Code Playgroud)

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

diffs file1 file2 [other diff args, e.g. -y]
Run Code Online (Sandbox Code Playgroud)

  • 如果脚本具有参数,那么"$ {@:3}"也很好,但也可以将参数传递给它们调用的其他脚本.例如,我的一个项目有一个用于轻松运行程序的脚本,其中包含要使用的主类的参数.然后``$ {@:2}"`可用于将剩余的参数传递给该入口点. (16认同)
  • @Kat已经提到了这一点,但要澄清(如果你还有疑问):`command"$ @"`相当于`command $ 1"$ {@:2}"`. (9认同)
  • 我的天啊!我亲你! (2认同)

Mia*_*rke 52

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

abc "$@"
Run Code Online (Sandbox Code Playgroud)

  • 不,我的错误。当您在示例中引用 $@ 时它会起作用,但在描述性文本中不带引号使用它时则不起作用。 (2认同)

Giu*_*one 44

这是一个简单的脚本:

#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}
Run Code Online (Sandbox Code Playgroud)

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

  • 对于第一个参数,它将是`$ {args [0]}`:o (3认同)
  • 通过索引调用参数(例如,$ 1),将$ @传递给数组提供了什么好处? (3认同)

rob*_*uck 34

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

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

我没有看到它提到过.

  • 你可以只使用 `$1`, `$2`,... 作为前两个 (3认同)

Viv*_*sse 18

abc "$@"
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你不引用`$ @`,你将失去正确的单词分裂 (15认同)

and*_*ien 14

abc“ $ @”通常是正确的答案。但是我试图将参数传递给su命令,并且没有任何引号可以阻止错误su: unrecognized option '--myoption'。实际上对我有用的是将所有参数作为单个字符串传递:

abc "$*"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗨,OP,看来您可能在abc示例中有错字 (2认同)
  • 正是我所需要的。我的命令用引号引起来,这是唯一对我有用的东西。 (2认同)
  • 可能是使用方式,但是请注意使用字符串参数时的风险。请在此处查看“ $ *”示例:/sf/answers/3234389231/(关于'$ @'与'$ *'的更多信息以及引用的变体) (2认同)