como passar corretamente _set_ de parâmetros com espaços na função shell

0

Meu problema não é simples passar parâmetros com espaços (eu sei como conseguir isso), considere um caso mais complicado:

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"

como equivalente a

make CC=gcc CFLAGS=XXX VAR1="a b" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm"

Eu gostaria de conseguir este para trabalhar em shell (soluções portáteis por favor, sem bashisms, etc). Alguma sugestão, recomendações?

    
por 0andriy 05.07.2016 / 18:17

1 resposta

2

Existem dois elementos para uma solução melhor:

  • shift
  • (mais) citando

Defina a função usando shift , assim:

function build {
  local cc="$1"
  local cflags="$2"
  shift 2
  make CC="$cc" CFLAGS="$cflags" "$@"
}

onde salvamos os dois primeiros parâmetros para as variáveis locais e, em seguida, deslocamos toda a matriz de argumentos por dois; também, cite a expansão "$ @".

Depois, chame-o com aspas extras, assim:

build gcc "XXX" 'VAR1="a b" VAR2="c=A d=B"' 'LDFLAGS="-L/opt/lib -lm"'

onde as aspas simples protegem os argumentos extras na função; caso contrário, o shell removerá as aspas e você ficaria com VAR2=c=A d=B (sem aspas) na função.

    
por 05.07.2016 / 18:55