2017-12-14 12 views
1

선행 파운드 기호 (octothorpe)가 있거나 없을 수도있는 bash 스크립트에 대한 인수를 처리해야합니다. 가장 간단한 예는 다음과 같습니다선행 파운드 기호 (octothorpe)로 bash 인수를 얻는 방법

echo #1234 

아무것도

이 명령으로 텍스트를 처리하고 주석입니다 가정하기 때문에 그것은있을 수를 반환한다.

$ @, $ * 등이 작동하지 않습니다. getopts는 이런 종류의 문제를 해결하지 못하는 것 같습니다.

제안은 문제의 "인수가"주석으로 해석하고 모든에서 명령에 전달되지 않습니다 때문에이 완전히 불가능

답변

4

환영합니다.

은 명심 C에서 프로그램을 자신의 main 기능에 대한 다음 호출 규칙이 있습니다

int main(int argc, char *argv[]) 

이 프로그램이 아닌 아닌 하나의 문자열 개인, 별도의 인수 목록이 전달되는 것을 의미한다을 아직 파싱 된. 인수의 벡터가 파싱 된 원본 문자열은 호출 된 프로그램에 전혀 제공되지 않습니다. 종종 "원래 문자열"도 존재하지 않습니다. 결과적으로 호출 된 프로그램은 "종을 해제"하고 구문 분석 된 문자열 목록에서 해당 문자열이 생성 된 원래 문자열로 돌아갈 방법이 없습니다.

결과적으로 스크립트가 외부 명령 (쉘 기능과 반대)으로 호출되면 운영 체제에서 실행하는 쉘 호출은 the execve syscall을 거치며 인수는 (1) 실행할 파일; (2) 그것을 전달하기위한 인수 벡터 (즉 앞서 언급 한 개별 C 문자열의 목록); (3) 환경 변수 목록. 분석되지 않은 쉘 명령 행에 대한 인수가 없으므로 해당 내용을 서브 프로세스에서 사용할 수 없습니다.


적절한 인용을 사용하도록 사용자를 교육하십시오.

yourscript '#1234' # single quotes prevent content from being parsed as shell syntax 
yourscript ''#1234 # "#" only begins a comment at the front of a string 
yourscript '#'1234 # note that shell quoting is character-by-character 
yourscript \#1234 # ...so either quoting or escaping only that single character suffices. 

가 ... 위 중 하나를 포함하는 argv을 전달합니다 (C 구문) char[][]{ "yourscript", "#1234", NULL }

+0

어떤 생각을 선도적 파운드 _why_ : 아래의 모든 yourscript에 관한하는 한, 완전히 구별 할 수없는 행동을해야합니다 이 (의도하지 않은) 부작용이 있습니까? –

+0

@ 리차드 헤이븐, 의도하지 않은 것은 무엇입니까? 그것은 주석 구문입니다. C에서 코드로 파싱되지 않는'/ * something * /','Python에서는 코드로 해석되지 않는'# something', C++에서는'// something'보다''의도하지 않은 ' ->'SGML 계열 언어 등 –

+0

명령 행을 단일 행 스크립트로 취급하고있는 경우, 8 진수는 해당 행에서의 명령으로 해석됩니다. 지금 받으십시오. –