我有以下功能:
bar() { echo $1:$2; }
我从调用这个函数其他功能,foo
。foo
其本身的调用方式如下:
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 test
到bar
函数。在本例中,传递给函数 bar 的第一个参数是This
,第二个参数是is
。
对于$@
,每个参数都是一个带引号的字符串,这意味着您将转到'This is'
'a'
'test'
函数bar
。所以传递给函数 bar 的第一个参数是This is
,第二个参数是a
。