다음 예에서는 예상되는 "ab c" 대신 "ab"를 반환합니다.
test() { bash -c "testargs() { echo \$@; }; testargs $@"; }
test "a b" c
이건 인용 문제인 것 같습니다. "$*"를 사용하지 않고 이 문제를 어떻게 해결할 수 있나요?
답변1
$@
"$@"
거의 한 문장으로 form 으로만 사용해야 합니다 . 확장되면 첫 번째 위치 인수가 앞에 추가되고 그 뒤에 추가 위치 인수가 "stuff$@"
포함된 목록이 생성됩니다 . stuff
예를 들어, 위치 인수가 foo
and 이면 and bar
라는 두 단어를 얻게 됩니다 . 이것은 귀하의 질문 중 하나입니다.stufffoo
bar
또 다른 문제는 사용 시 sh -c
옵션이 아닌 첫 번째 인수가 사용 가능한 스크립트 이름이 된다는 것입니다 $0
. 이후의 비옵션 매개변수는 위치 매개변수가 됩니다. 따라서 sh -c 'echo "$@"' foo bar qux
print bar qux
- 는 foo
in $0
, bar
in $1
및 qux
in 입니다 $2
.
함수의 인수를 스크립트에 전달하려면 $@
스크립트 내에서 사용하십시오(당신이 했던 것처럼 함수 내에서가 아니라 "stuff$@"
큰따옴표로 인해 함수를 실행하는 셸에서 확장됨). 그리고 점령 $0
.
test() { bash -c 'testargs() { echo "$@"; }; testargs "$@"' myscript "$@"; }
답변2
큰따옴표 안의 $@는 여러 단어로 확장됩니다. bash -c
수용하다끈매개변수로 사용되지만 뒤에 다른 매개변수가 올 수도 있습니다.성격그런 다음 $0으로 시작하는 위치 매개변수에 할당됩니다.
따라서 다음과 같이 내부 코드에 매개변수를 보낼 수 있습니다 bash -c
.
Test () { bash -c 'echo $@' -- "$@" ; }
Test "a b" c
이는 귀하의 경우에도 적용됩니다:
Test () { bash -c 'testargs() { echo $@ ; } ; testargs $@' -- "$@" ; }
Test "a b" c
여러 단어로 구성된 매개변수를 유지하려면 큰따옴표를 추가하세요.
Test () {
bash -c 'testargs() {
for a in "$@" ; do
echo "$a"
done
}
testargs "$@"' \
-- "$@"
}
Test "a b" c
이미 존재하고 독자들에게 혼란을 줄 수 있기 Test
때문에 사용했습니다 .test