![POSIX 쉘 스크립트의 이러한 중첩 옵션이 토큰화되는 이유는 무엇입니까?](https://linux55.com/image/83548/POSIX%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%9D%B4%EB%9F%AC%ED%95%9C%20%EC%A4%91%EC%B2%A9%20%EC%98%B5%EC%85%98%EC%9D%B4%20%ED%86%A0%ED%81%B0%ED%99%94%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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_1
및 ARGS_2
)에서 매개변수를 분리할 수 있도록 매개변수를 변수에 저장하는 것이 여전히 가능합니까?
내 것은 /bin/sh
입니다 dash
.
답변1
첫 번째 경우에 전달된 인수는 count_args
쉘에 의해 해석되며, 쉘은 두 단어를 보고 이를 에 전달 --options
합니다 .1 2
count_args
두 번째 경우에는 큰따옴표 안의 $
및를 제외한 모든 문자가 \
리터럴로 처리됩니다. 쉘이 작은따옴표를 해석하기에는 너무 늦었습니다. 쉘은 $ARGS
변수의 내용을 긴 문자열로 처리하며 --options '1 2'
모든 문자는 리터럴로 처리되며 쉘에 특별한 의미가 없습니다.
${ARGS}
큰따옴표 없이 사용하면 필드가 분할되고 파일 이름이 확장됩니다. 기본값을 사용하면 , 및 의 IFS
세 가지 개별 단어가 표시됩니다 .--options
'1
2'
보관하는 가장 좋은 방법은 다음을 사용하는 것입니다 "$@"
.
#!/bin/sh
set -- --options '1 2'
./count_args "$@"