提问人:devoured elysium 提问时间:9/28/2010 最后编辑:Matthias Braundevoured elysium 更新时间:9/17/2022 访问量:542179
如何将传递给我的 Bash 脚本的所有参数传递给我的函数?[复制]
How to pass all arguments passed to my Bash script to a function of mine? [duplicate]
问:
假设我有一个函数,它将处理与分析传递给我的脚本的参数相关的逻辑。abc()
如何将 Bash 脚本收到的所有参数传递给?参数的数量是可变的,所以我不能像这样对传递的参数进行硬编码:abc()
abc $1 $2 $3 $4
更好的是,我的函数有什么方法可以访问脚本参数的变量吗?
答:
abc "$@"
$@
表示给定给 bash 脚本的所有参数。
评论
$@
使用该变量,该变量将扩展到所有以空格分隔的命令行参数。$@
abc "$@"
评论
下面是一个简单的脚本:
#!/bin/bash
args=("$@")
echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}
$#
是脚本接收的参数数。我发现使用数组更容易访问它们:该行将所有参数放在数组中。要访问它们,请使用 .args=("$@")
args
${args[index]}
评论
${args[0]}
$1
$0
if [[ $(id -u) -ne 0 ]]; then sudo "$0" "$@"; exit 0; fi
/bin/sh
bash script.sh
该变量将扩展到所有以空格分隔的命令行参数。下面是一个示例。$@
abc "$@"
使用 时,您应该(几乎)始终将其放在双引号中,以避免错误解析包含空格或通配符的参数(见下文)。这适用于多个参数。它还可以移植到所有符合 POSIX 标准的 shell。$@
还值得注意的是,(通常是脚本的名称或路径)不在 .$0
$@
Bash 参考手册特殊参数部分说,从 1 开始扩展到位置参数。当扩展发生在双引号内时,每个参数将扩展为一个单独的单词。这相当于 .$@
"$@"
"$1" "$2" "$3"...
传递一些参数:
如果要传递除第一个参数之外的所有参数,可以先使用 to “使用” 第一个参数,然后传递以将其余参数传递给另一个命令。在 Bash 中(以及 zsh 和 ksh,但不是在像 dash 这样的普通 POSIX shell 中),你可以这样做,而不会使用数组切片的变体弄乱参数列表:将为你提供以 . 如果通过了那么多参数,则最多可以获得四个从 (即 ) 开始的参数。shift
"$@"
"${@:3}"
"$3"
"${@:3:4}"
"$3"
"$3" "$4" "$5" "$6"
您可能不想做的事情:
"$*"
将所有参数粘在一起到一个字符串中(用空格分隔,或任何第一个字符 is)。这就失去了参数内空格和参数之间空格之间的区别,因此通常是一个坏主意。尽管打印参数可能是可以的,例如,只要您不关心保留区分内/之间的空间。$IFS
echo "$*"
将参数分配给常规变量(如 ) 会像 一样将所有参数混合在一起。如果要将参数存储在变量中,请使用数组(括号使其成为数组),然后引用它们,例如 等。请注意,在 Bash 和 ksh 中,数组索引从 0 开始,所以会在 中,以此类推。 另一方面,zsh 从 1 开始数组索引,所以会在 .而像破折号这样的更基本的 shell 根本没有数组。args="$@"
"$*"
args=("$@")
"${args[0]}"
$1
args[0]
$1
args[1]
省略双引号,使用 or 或 ,将尝试将每个参数拆分为单独的单词(基于空格或其中的任何内容),并尝试将任何看起来像文件名通配符的内容扩展为匹配文件名的列表。这可能会产生非常奇怪的效果,几乎总是应该避免。(除了在 zsh 中,默认情况下不会进行此扩展。$@
$*
$IFS
评论
"${@:3}"
似乎不适用于 .zsh
$*
IFS
$*
$IFS
$*
$@
我需要对此进行更改,我希望这对其他人有用:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
该部分表示从 3 开始的数组的所有成员。因此,此函数通过排序将前两个参数传递给 diff,然后将所有其他参数传递给 diff 来实现排序的 diff,因此您可以将其调用与 diff 类似:"${@:3}"
diffs file1 file2 [other diff args, e.g. -y]
评论
"${@:3}"
"${@:2}"
command "$@"
command $1 "${@:2}"
值得一提的是,您可以使用此语法指定参数范围。
function example() {
echo "line1 ${@:1:1}"; #First argument
echo "line2 ${@:2:1}"; #Second argument
echo "line3 ${@:3}"; #Third argument onwards
}
我没有看到它被提及。
评论
$1
$2
$@
ABC“$@”一般是正确答案。
但是我试图将参数传递给 su 命令,再多的引用也无法阻止错误。真正对我有用的是将所有参数作为单个字符串传递:su: unrecognized option '--myoption'
abc "$*"
我的确切情况(我敢肯定其他人需要这个)在我的 .bashrc 中
# run all aws commands as Jenkins user
aws ()
{
sudo su jenkins -c "aws $*"
}
评论
abc
bash
$@
$*
su
$*
$@
评论