如何正确地将带空格的参数集传递到 shell 函数中

如何正确地将带空格的参数集传递到 shell 函数中

我的问题不是简单地传递带空格的参数(我知道如何实现),考虑更复杂的情况:

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在函数中留下(不带引号的)。

相关内容