$@가 bash에서 큰따옴표와 충돌하는 것을 방지하는 방법은 무엇입니까?

$@가 bash에서 큰따옴표와 충돌하는 것을 방지하는 방법은 무엇입니까?

다음 예에서는 예상되는 "ab c" 대신 "ab"를 반환합니다.

test() { bash -c "testargs() { echo \$@; }; testargs $@"; }
test "a b" c

이건 인용 문제인 것 같습니다. "$*"를 사용하지 않고 이 문제를 어떻게 해결할 수 있나요?

답변1

$@"$@"거의 한 문장으로 form 으로만 사용해야 합니다 . 확장되면 첫 번째 위치 인수가 앞에 추가되고 그 뒤에 추가 위치 인수가 "stuff$@"포함된 목록이 생성됩니다 . stuff예를 들어, 위치 인수가 fooand 이면 and bar라는 두 단어를 얻게 됩니다 . 이것은 귀하의 질문 중 하나입니다.stufffoobar

또 다른 문제는 사용 시 sh -c옵션이 아닌 첫 번째 인수가 사용 가능한 스크립트 이름이 된다는 것입니다 $0. 이후의 비옵션 매개변수는 위치 매개변수가 됩니다. 따라서 sh -c 'echo "$@"' foo bar quxprint bar qux- 는  fooin $0, barin $1quxin 입니다 $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

관련 정보