![공백이 포함된 매개변수 세트를 쉘 함수에 올바르게 전달하는 방법](https://linux55.com/image/89904/%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EC%84%B8%ED%8A%B8%EB%A5%BC%20%EC%89%98%20%ED%95%A8%EC%88%98%EC%97%90%20%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C%20%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
내 문제는 단순히 공백이 포함된 인수를 전달하는 것이 아닙니다(그 방법을 알고 있습니다). 더 복잡한 경우를 고려해보세요.
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
함수(따옴표 없이)만 남습니다.