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

Kon*_*lph 10 bash quoting function arguments

我有以下功能:

bar() { echo $1:$2; }
Run Code Online (Sandbox Code Playgroud)

我正在从另一个函数调用这个函数,foo. foo本身被称为如下:

foo "This is" a test
Run Code Online (Sandbox Code Playgroud)

我想获得以下输出:

This is:a
Run Code Online (Sandbox Code Playgroud)

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

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

  • foo() { bar $*; }

    - 输出: this:is

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

    - 输出: this is a test:

我的问题是如何有效地保留参数的引用。这可能吗?

Lri*_*Lri 15

使用"$@"

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a
Run Code Online (Sandbox Code Playgroud)

"$@""$*"有特殊含义:

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


cuo*_*glm 6

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

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

foo() { bar "$@"; }

foo "This is" a test
Run Code Online (Sandbox Code Playgroud)

输出

This is:a
Run Code Online (Sandbox Code Playgroud)

为什么有效?

因为使用$*,所有参数都被视为一个单词,这意味着您将传递This is a testbar函数。在这种情况下,传递给函数 bar 的第一个参数是This,第二个是is

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