다음과 같은 기능이 있습니다.
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:
내 질문은 효과적으로 인수의 인용을 보존 할 수있는 방법입니다. 이것이 가능합니까?
답변
사용 "$@"
:
$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a
"$@"
및 "$*"
특별한 의미를 갖습니다 :
"$@"
단어를 확장하지 않고 여러 단어로 확장합니다 (예"$1" "$2" ...
:)."$*"
위치 매개 변수를 IFS의 첫 문자 (또는 IFS가 설정되지 않은 경우 공백 또는 IFS가 비어있는 경우 공백)와 결합합니다.
답변
$@
대신을 사용해야합니다$*
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
입니다.