다음과 같은 기능이 있습니다.
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입니다.