我的问题不是简单地传递带空格的参数(我知道如何实现),考虑更复杂的情况:
function build() {
make CC="$1" CFLAGS="$2" $* # $* is not correct here!
}
build gcc "XXX" VAR1="a b" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm"
相当于
make CC=gcc CFLAGS=XXX VAR1="a b" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm"
我想实现这一目标,以便在 shell 中工作(请提供便携式解决方案,不要使用 bashisms 等)。有什么建议、推荐吗?
答案1
更好的解决方案有两个要素:
shift
- (更多)引用
使用 定义函数shift
,如下所示:
function build {
local cc="$1"
local cflags="$2"
shift 2
make CC="$cc" CFLAGS="$cflags" "$@"
}
我们将前两个参数保存到局部变量中,然后将整个参数数组移动 2;另外,引用“$@”扩展。
然后,用额外的引号调用它,如下所示:
build gcc "XXX" 'VAR1="a b" VAR2="c=A d=B"' 'LDFLAGS="-L/opt/lib -lm"'
其中单引号保护函数中的额外参数;否则,shell 会删除引号,并且您将VAR2=c=A d=B
在函数中留下(不带引号的)。