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 为空,则为空)。您必须使用$@
, 而不是$*
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 test
给bar
函数。在这种情况下,传递给函数 bar 的第一个参数是This
,第二个是is
。
使用$@
,每个参数都是一个带引号的字符串,这意味着您将传递'This is'
'a'
'test'
给bar
函数。所以传递给函数 bar 的第一个参数是This is
,第二个是a
。