공백이 포함된 매개변수 세트를 쉘 함수에 올바르게 전달하는 방법

공백이 포함된 매개변수 세트를 쉘 함수에 올바르게 전달하는 방법

내 문제는 단순히 공백이 포함된 인수를 전달하는 것이 아닙니다(그 방법을 알고 있습니다). 더 복잡한 경우를 고려해보세요.

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"

나는 이것이 쉘에서 작동하도록 하고 싶습니다(이식 가능한 솔루션을 제공하고 bashism 등을 사용하지 마십시오). 어떤 제안이나 권장 사항이 있습니까?

답변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"'

작은 따옴표는 함수의 추가 인수를 보호합니다. 그렇지 않으면 쉘이 따옴표를 제거하고 VAR2=c=A d=B함수(따옴표 없이)만 남습니다.

관련 정보