<分区>
假设我有一个函数 abc()
,它将处理与分析传递给我的脚本的参数相关的逻辑。
如何将我的 Bash 脚本收到的所有参数传递给 abc()
?参数的数量是可变的,所以我不能像这样硬编码传递的参数:
abc $1 $2 $3 $4
更好的是,我的函数有什么方法可以访问脚本参数的变量吗?
<分区>
假设我有一个函数 abc()
,它将处理与分析传递给我的脚本的参数相关的逻辑。
如何将我的 Bash 脚本收到的所有参数传递给 abc()
?参数的数量是可变的,所以我不能像这样硬编码传递的参数:
abc $1 $2 $3 $4
更好的是,我的函数有什么方法可以访问脚本参数的变量吗?
最佳答案
$@
变量扩展为所有由空格分隔的命令行参数。这是一个例子。
abc "$@"
当使用 $@
时,您应该(几乎)总是将其放在双引号中以避免错误解析包含空格或通配符的参数(见下文)。这适用于多个参数。它还可以移植到所有符合 POSIX 标准的 shell。
还值得注意的是 $0
(通常是脚本的名称或路径)不在 $@
中。
Bash Reference Manual Special Parameters Section表示 $@
扩展为从 1 开始的位置参数。当扩展发生在双引号内时,每个参数都会扩展为一个单独的词。即 "$@"
等同于 "$1""$2""$3"...
。
如果你想传递除第一个参数之外的所有参数,你可以先使用shift
“消耗”第一个参数,然后传递“$@”
将剩余的参数传递给另一个命令。在 Bash(以及 zsh 和 ksh,但不是像 dash 这样的普通 POSIX shell 中),您可以使用数组切片的变体在不弄乱参数列表的情况下执行此操作:"${@:3}"
将为您提供以 "$3"
开头的参数。 "${@:3:4}"
将为您提供从 "$3"
开始的最多四个参数(即 "$3""$4""$5""$6"
),如果传递了那么多参数。
"$*"
将所有参数组合成一个字符串(用空格分隔,或者 $IFS
的第一个字符是什么)。这失去了 within 参数和 between 参数之间的区别,因此通常不是一个好主意。尽管打印参数可能没问题,例如echo "$*"
,前提是您不关心保留区别内/区别之间的空间。
将参数分配给常规变量(如 args="$@"
)将所有参数混合在一起,就像 "$*"
一样。如果要将参数存储在变量中,请使用带有 args=("$@")
的数组(括号使其成为一个数组),然后将它们引用为例如"${args[0]}"
等。请注意,在 Bash 和 ksh 中,数组索引从 0 开始,因此 $1
将在 args[0] 中
等。另一方面,zsh 从 1 开始数组索引,因此 $1
将在 args[1]
中。而像 dash 这样的更基本的 shell 根本没有数组。
使用 $@
或 $*
省略双引号,将尝试将每个参数拆分为单独的词(基于空格或 $IFS
),并尝试将任何看起来像文件名通配符的内容扩展到匹配文件名列表中。这可能会产生非常奇怪的效果,并且几乎应该始终避免。 (在 zsh 中除外,默认情况下不会进行此扩展。)
关于bash - 如何将传递给我的 Bash 脚本的所有参数传递给我的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811345/