传递参数以保持原样


10

我有以下功能:

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:

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


Answers:


14

用途"$@"

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

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

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

谢谢,我不知道$*这种语义-现在是合乎逻辑的。我认为这个答案实际上解决了我遍历数组时遇到的另一个问题……
Konrad Rudolph

6

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

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

foo() { bar "$@"; }

foo "This is" a test

输出

This is:a

为什么行得通?

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

使用$@,每个参数都是带引号的字符串,这意味着您将传递'This is' 'a' 'test'barfuntion。因此,传递给功能栏的第一个参数是This is,第二个是a

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.