그대로 작동하도록 인수 전달


10

다음과 같은 기능이 있습니다.

bar() { echo $1:$2; }

이 함수를 다른 함수 에서 호출하고 있습니다 foo. foo자체는 다음과 같이 호출됩니다.

foo "This is" a test

다음과 같은 결과를 얻고 싶습니다.

This is:a

즉, bar받는 인수 는 내가 전달한 것과 동일한 토큰이어야합니다 foo.

foo이를 달성하기 위해 어떻게 구현해야합니까? 다음 두 가지 구현을 시도했지만 작동하지 않습니다.

  • foo() { bar $*; }

    – 출력 : this:is

  • foo() { bar "$*"; }

    – 출력 : this is a test:

내 질문은 효과적으로 인수의 인용을 보존 할 수있는 방법입니다. 이것이 가능합니까?


답변:


14

사용 "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@""$*"특별한 의미를 갖습니다 :

  • "$@"단어를 확장하지 않고 여러 단어로 확장합니다 (예 "$1" "$2" ...:).
  • "$*" 위치 매개 변수를 IFS의 첫 문자 (또는 IFS가 설정되지 않은 경우 공백 또는 IFS가 비어있는 경우 공백)와 결합합니다.

고마워, 나는 $*이 의미가 있다는 것을 몰랐다 – 이제 그것은 논리적이다. 이 답변은 실제로 배열을 반복 할 때 발생했던 또 다른 문제를 해결한다고 생각합니다…
Konrad Rudolph

6

$@대신을 사용해야합니다$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

출력

This is:a

왜 작동합니까?

를 사용 $*하면 모든 매개 변수가 단일 단어 로 표시되므로 함수에 전달 This is a test됩니다 bar. 이 경우 기능 막대에 대한 첫 번째 매개 변수 전달은 This이고 두 번째는 is입니다.

을 사용 $@하면 각 매개 변수가 따옴표로 묶인 문자열 이므로 함수에 전달 'This is' 'a' 'test'됩니다 bar. 따라서 기능 표시 줄에 대한 첫 번째 매개 변수는 This is이고, 두 번째는 a입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.