나는 다음과 같은 기능을 가지고 있습니다 :
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
.