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 호환 방식으로 이를 방지하려면 어떻게 해야 합니까?호출 스크립트에서? 더 복잡한 스크립트(예: ARGS_1및 포함)에서 인수를 분리할 수 있도록 변수에 인수를 저장하는 것이 가능합니까 ARGS_2?

/bin/sh는 입니다 dash.

답변1

첫 번째 경우에 전달된 인수는 count_args셸에 의해 해석되었으며 셸은 두 단어를 확인한 --options다음 1 2에 전달했습니다 count_args.

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

큰따옴표 없이 사용하면 ${ARGS}필드 분할 및 파일 이름 확장이 발생합니다. 기본값이 이면 , 및 IFS3개의 분리된 단어가 표시됩니다 .--options'12'

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

#!/bin/sh

set -- --options '1 2'

./count_args "$@"

관련 정보