完全按原样将参数传递给函数

完全按原样将参数传递给函数

我有以下功能:

bar() { echo $1:$2; }

我从调用这个函数其他功能,foofoo其本身的调用方式如下:

foo "This is" a test

我想得到以下输出:

This is:a

也就是说,bar接收到的参数应该与我传递给 的标记相同foo

foo为了实现这一目标,需要如何实施?我尝试了以下两种实现,但都不起作用:

  • foo() { bar $*; }

    - 输出:this:is

  • foo() { bar "$*"; }

    - 输出:this is a test:

我的问题实际上是如何保留对论点的引用。这有可能吗?

答案1

使用"$@"

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"并且"$*"有特殊的含义:

  • "$@"扩展为多个单词而不对单词执行扩展(例如"$1" "$2" ...)。
  • "$*"将位置参数与 IFS 中的第一个字符连接(如果 IFS 未设置,则使用空格;如果 IFS 为空,则不连接)。

答案2

您必须使用$@, 而不是$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

输出

This is:a

为什么它有效?

因为对于$*,所有参数都被视为一个字,这意味着您将传递This is a testbar函数。在本例中,传递给函数 bar 的第一个参数是This,第二个参数是is

对于$@,每个参数都是一个带引号的字符串,这意味着您将转到'This is' 'a' 'test'函数bar。所以传递给函数 bar 的第一个参数是This is,第二个参数是a

相关内容