POSIX 쉘 스크립트의 이러한 중첩 옵션이 토큰화되는 이유는 무엇입니까?

POSIX 쉘 스크립트의 이러한 중첩 옵션이 토큰화되는 이유는 무엇입니까?

count_args매개변수를 계산하는 스크립트가 있습니다.

#!/bin/sh
echo $#

이러한 옵션을 사용하여 호출하면 두 개의 매개변수가 있음을 알려줍니다.

$ ./count_args --options '1 2'
2

하지만 스크립트에서 매개변수를 test_args다음과 같이 구성하면:

#!/bin/sh
ARGS="--options '1 2'"
./count_args ${ARGS}

...결과는 다음과 같습니다.

$ ./test_args 
3

'1 2'스크립트에 분할이 있는 이유는 무엇입니까? POSIX 호환 방식으로 이를 방지하려면 어떻게 해야 합니까?다음에서 스크립트 호출? 좀 더 복잡한 스크립트(예: have ARGS_1ARGS_2)에서 매개변수를 분리할 수 있도록 매개변수를 변수에 저장하는 것이 여전히 가능합니까?

내 것은 /bin/sh입니다 dash.

답변1

첫 번째 경우에 전달된 인수는 count_args쉘에 의해 해석되며, 쉘은 두 단어를 보고 이를 에 전달 --options합니다 .1 2count_args

두 번째 경우에는 큰따옴표 안의 $및를 제외한 모든 문자가 \리터럴로 처리됩니다. 쉘이 작은따옴표를 해석하기에는 너무 늦었습니다. 쉘은 $ARGS변수의 내용을 긴 문자열로 처리하며 --options '1 2'모든 문자는 리터럴로 처리되며 쉘에 특별한 의미가 없습니다.

${ARGS}큰따옴표 없이 사용하면 필드가 분할되고 파일 이름이 확장됩니다. 기본값을 사용하면 , 및 의 IFS세 가지 개별 단어가 표시됩니다 .--options'12'

보관하는 가장 좋은 방법은 다음을 사용하는 것입니다 "$@".

#!/bin/sh

set -- --options '1 2'

./count_args "$@"

관련 정보