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

如何将传递给bash脚本的所有参数传递给我的函数?,bash,function,parameter-passing,Bash,Function,Parameter Passing,假设我定义了一个函数abc(),它将处理与分析传递给脚本的参数相关的逻辑 如何将bash脚本收到的所有参数传递给它?参数的数量是可变的,所以我不能像这样硬编码传递的参数: abc $1 $2 $3 $4 编辑。更好的是,我的函数是否有办法访问脚本参数的变量 abc "$@" $@表示给定给bash脚本的所有参数 $@表示给定给bash脚本的所有参数。使用$@变量,该变量扩展到所有由空格分隔的命令行参数 abc "$@" 使用$@变量,该变量将扩展到所有由空格分隔的命令行参数 abc "$@

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

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

abc $1 $2 $3 $4
编辑。更好的是,我的函数是否有办法访问脚本参数的变量

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


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

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

abc "$@"

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

abc "$@"

下面是一个简单的脚本:

#!/bin/bash

args=("$@")

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

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

以下是一个简单的脚本:

#!/bin/bash

args=("$@")

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

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

变量将扩展到所有由空格分隔的命令行参数。这里有一个例子

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

如果
$0
(通常是脚本的名称或路径)不在
$@
中,则也没有任何价值

说明
$@
从一开始扩展到位置参数。当展开发生在双引号内时,每个参数展开为一个单独的字。也就是说,
“$@”
相当于
“$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]}”
等。请注意,在bash和ksh中,数组索引从0开始,因此
$1
将位于
args[0]
等zsh中,另一方面,从1开始数组索引,因此
$1
将位于
参数[1]
中。而且像dash这样的更基本的shell根本没有数组


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

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

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

如果
$0
(通常是脚本的名称或路径)不在
$@
中,则也没有任何价值

说明
$@
从一开始扩展到位置参数。当展开发生在双引号内时,每个参数展开为一个单独的字。也就是说,
“$@”
相当于
“$1”$2”$3”…

传递一些参数: 如果要传递除第一个参数外的所有参数,可以先使用
shift
来“使用”第一个参数,然后传递
“$@”
将其余参数传递给另一个命令。在bash(以及zsh和ksh,但不是在像dash这样的普通POSIX shell中)中,您可以使用数组切片的变体在不干扰参数列表的情况下执行此操作:
“${@:3}”
将获得以
“$3”
开头的参数<代码>“${@:3:4}”将为您提供最多四个从
“$3”
开始的参数(即
“$3”“$4”“$5”“$6”“
),如果传递了那么多参数

您可能不想做的事情:
“$*”
将所有参数组合在一个字符串中(用空格分隔,或者用
$IFS
的第一个字符分隔)。这就失去了我们之间的区别
abc "$*"
# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}