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

问题描述 投票:485回答:7

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

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

abc $1 $2 $3 $4

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

bash function parameter-passing
7个回答
849
投票

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

abc "$@"

当使用$@时,你应该(几乎)总是把它放在双引号中,以避免错误地使用带有空格的参数。这适用于多个参数。 $*将作为一个长串传递。

$0不在$@也是值得的。

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

如果要传递除第一个参数之外的所有参数,可以先使用shift“消耗”第一个参数,然后传递$@将其余参数传递给另一个命令。在bash中(但不是在普通的POSIX shell中),你可以使用数组切片的变体来解决参数列表:"${@:3}"将为你提供以"$3"开头的参数。如果通过许多论点,"${@:3:4}"将从"$3"(即"$3" "$4" "$5" "$6")开始向你提供最多四个参数。


137
投票

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

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

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

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

52
投票

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

abc "$@"

44
投票

这是一个简单的脚本:

#!/bin/bash

args=("$@")

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

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


34
投票

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

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

我没有看到它提到过。


17
投票
abc "$@"

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


12
投票

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

abc "$*"

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

# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}
© www.soinside.com 2019 - 2024. All rights reserved.