함수에 인수를 있는 그대로 정확하게 전달합니다.

함수에 인수를 있는 그대로 정확하게 전달합니다.

나는 다음과 같은 기능을 가지고 있습니다 :

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:

내 질문은 실제로 인수에 대한 참조를 유지하는 방법입니다. 이것이 가능한가?

답변1

사용 "$@":

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

"$@"그리고 "$*"특별한 의미가 있습니다:

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

답변2

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

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.

관련 정보