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}
필드 분할 및 파일 이름 확장이 발생합니다. 기본값이 이면 , 및 IFS
3개의 분리된 단어가 표시됩니다 .--options
'1
2'
이를 보관하는 가장 좋은 방법은 다음을 사용하는 것입니다 "$@"
.
#!/bin/sh
set -- --options '1 2'
./count_args "$@"