게토프
getopts개발자 | 다양한 오픈 소스 및 상업용 개발자 |
---|---|
초기 릴리즈 | 1986; | 전 (
운영 체제 | Unix, Unix 유사, IBM i |
유형 | 명령 |
getopts
명령줄 인수를 구문 분석하기 위한 기본 제공 Unix 셸 명령.getopt의 C 인터페이스를 기반으로 POSIX 유틸리티 구문 가이드라인을 따르는 명령행 인수를 처리하도록 설계되었다.
의 전임자.getopts
유닉스 시스템 연구소의 외부 프로그램이었다.
역사
원본getopt
몇 가지 문제가 있었다: 그것은 논쟁에서 공백이나 껍질 메타캐랙터를 다룰 수 없었고, 오류 메시지의 출력을 비활성화할 수 있는 능력이 없었다.[1]
getopts
1986년에 Unix SVR3와 함께 선적된 Bourne shell에 처음 도입되었다.현재 및 인수 위치의 위치를 추적하기 위해 쉘의 자체 변수를 사용한다.OPTIND 및 OPTARG를 선택하고 셸 변수의 옵션 이름을 반환하십시오.[2]본 셸의 이전 버전에는 겟탑이 없었다.
1995년에getopts
단일 UNIX 사양 버전 1 / X/Open Portability Guideline 이슈 4에 포함되었다.[3]결과적으로.getopts
현재 본 셸, 코른 셸, 알퀴스트 셸, 바쉬, 즈쉬를 포함한 셸로 이용 가능하다.[4]
getopts 명령도 IBM i 운영 체제에 포팅되었다.[5]
의 현대적 용법getopt
주로 활용률의 개선된 구현으로 인해 부분적으로 부활되었다.BSD 기반 이 버전getopt
, 단지 두개의 불평을 고쳤을 뿐만 아니라getopt
그러나 GNU 스타일의 긴 옵션과 옵션의 선택적 인수를 구문 분석하는 기능도 소개했다.getopts
그러나 다양한 BSD 분포는 이전 구현을 고수했다.[6][1]
사용법
getopt 및 getopts의 사용 개요는 C 형제와 유사하다.
getoptstring [thep] getopts opts opting varname [thep]
- optstring 부분은 C 형제와 같은 형식을 가지고 있다.
- 매개변수 부분은 단순히 구문 분석의 선택권을 원하는 것을 받아들인다.공통 값은 POSIX 셸의 모든 파라미터 "$@"이다.
- 이 값은 게토프(getopt)에 존재하지만 쉘의 파라미터에만 접근할 수 있기 때문에 거의 사용되지 않는다.그러나 파서를 재설정할 때는 유용하다.
- getopts의 varname 부분은 구문 분석된 옵션을 저장할 셸 변수의 이름을 지정한다.
그러나 명령어를 사용하는 방법은 매우 다양하다.
- getopt는 단순히 "instance" 인수를 나타내는 공백-instance 토큰을 포함하는 플랫 문자열을 반환한다.그리고 나서 한 사람은 그것을 원래대로 구문 분석하기 위해 약간의 루프를 사용한다.[1]
- getopts는 C getopt처럼 반복적으로 불려진다.논쟁의 끝에 도달하면 1(shell false)을 반환한다.[3]
향상된 기능
다양한 겟톱으로
2004년 봄(Solaris 10 베타 개발)에는 getopt()를 위한 libc 구현을 강화하여 긴 옵션을 지원하였다.그 결과, 이 새로운 기능은 내장 명령에서도 사용할 수 있었다.getopts
본 셸의.이는 긴 별칭을 지정하는 옵트스트링의 괄호화된 접미사에 의해 트리거된다.[7]
KornShell과 Zsh는 둘 다 긴 논쟁을 위한 확장을 가지고 있다.전자는 Solaris와 같이 정의되며 [8]후자는 별도의 방법으로 구현된다.zparseopts
명령하다[9]
KornShell은 다음으로 시작하는 옵션의 Optstring 확장을 추가로 구현+
대신에-
.[8]
Linux getopt의 경우
에 대한 대안.getopts
의 Linux 고급 버전getopt
, 외부 명령줄 프로그램.
의 Linux 고급 버전getopt
의 특별한 안전성을 가지고 있다getopts
고급 기능 추가.긴 옵션 이름(예:--help
() 및 옵션이 모든 피연산자 앞에 나타날 필요는 없다(예:command operand1 operand2 -a operand3 -b
의 Linux 고급 버전에 의해 허용됨getopt
하지만 와는 통하지 않는다.getopts
). 또한 쉘(tcsh, POSIX sh와 같은) 및 선택적 인수를 위한 메타카락터 탈출도 지원한다.[6]
비교
프로그램 특징 | POSIX 겟톱츠 | Solaris getopts | Unix/BSD getopt | 리눅스 getopt |
---|---|---|---|---|
쉬운 구문 분석을 위한 분할 옵션 | 네 | 네 | 네 | 네 |
오류 메시지 억제 허용 | 네 | 네 | 아니요. | 네 |
공백 및 메타카락터 사용 시 안전 | 네 | 네 | 아니요. | 네 |
피연산자와 옵션을 혼합할 수 있음 | 아니요. | 네 | 아니요. | 네 |
긴 옵션 지원 | 에뮬레이션 | 네 | 아니요. | 네 |
선택적 인수 | 오류 처리 | 오류 처리 | 아니요. | 네 |
예
다음과 같은 세 가지 옵션과 추가 인수를 사용하지 않는 bash에서 위키백과 다운로더를 구축한다고 가정합시다.
wpdown -a 아티클 이름 -l [언어] -v
가능하면 다음과 같은 긴 주장을 허용한다.
-a --a 문서 -l --l --언어, --message -v --message
명확하게 하기 위해 도움말 텍스트는 포함되지 않으며, 웹 페이지를 다운로드하는 프로그램이 있다고 가정한다.또한 모든 프로그램은 다음과 같은 형식이다.
#!/bin/bash VERBOSE=0 ARTICLE='' LANG=en # [EXAMPLE HERE] if ((VERBOSE > 2)); then printf '%s\n' 'Non-option arguments:' printf '%q ' "${remaining[@]]}" fi if ((VERBOSE > 1)); then printf 'Downloading %s:%s\n' "$LANG" "$ARTICLE" fi if [[ ! $ARTICLE ]]; then printf '%s\n' "No articles!">&2 exit 1 fi save_pair "https://${LANG}.wikipedia.org/wiki/${INSTAR}"
이전 getopt 사용
이전 getopt는 선택적 인수를 지원하지 않는다.
# 모든 것을 구문 분석한다; 만약 실패한다면 우리는 'a:l:v' 달러를 구한다. # 이제 우리는 소독된 아그를 갖게 되었다. 원본을 세트(-v)(-v)((VERBOSE++)로 대체한다. 대/소문자 구분(-) 1 in (-v) (-) $2; 교대조 2; (-l) LANG=$2; 교대조 2; (-) 교대조; 브레이크; (*) 출구; # esac 완료됨("$@")
이 대본은 또한 공간이나 조개 메타카락터(? 또는 *)가 들어 있는 기사 제목과 함께 깨질 것이다.
Getopts 사용
Getopts는 POSIX 선택적 인수가 아직 없지만 스크립트에 C 인터페이스의 모양과 느낌을 제공한다.
#!/bin/sh while getopts ':a:l:v' opt; do case $opt in (v) ((VERBOSE++));; (a) ARTICLE=$OPTARG;; (l) LANG=$OPTARG;; (:) # "optional arguments" (missing option-argument handling) case $OPTARG in (a) exit 1;; # error, according to our syntax (l) :;; # acceptable but does nothing esac;; esac done shift "$OPTIND" # remaining is "$@"
더 이상 셸 옵션을 직접 운용하지 않기 때문에 더 이상 변경할 필요가 없다.그러나, 지금 남아있는 논쟁들을 얻기 위해서는 슬라이싱 작업이 필요하다.
치료함으로써 긴 논쟁의 지지를 모방하는 것은 가능하지만 지루하다.--fast
의론으로서fast
어떤 선택으로.-
.[10]
Linux getopt 사용
리눅스 getopt는 출력을 벗어나고 셸이 이를 해석하도록 하려면 "평가" 명령이 필요하다.나머지는 변경되지 않음:
# We use "$@" instead of $* to preserve argument-boundary information ARGS=$(getopt -o 'a:l::v' --long 'article:,language::,lang::,verbose' -- "$@") exit eval "set -- $ARGS" while true; do case $1 in (-v --verbose) ((VERBOSE++)); shift;; (-a --article) ARTICLE=$2; shift 2;; (-l --lang --language) # handle optional: getopt normalizes it into an em[ -n "$2" ]인 경우 pty 문자열, 그 다음 LANG=$2 fi shift 2; (--) shift; break; (*) exit 1; # esac done ac done acided use=("$@")
참고 항목
참조
- ^ a b c FreeBSD 일반 명령 설명서 –
- ^ Mascheck, Sven. "The Traditional Bourne Shell Family". Retrieved 2010-12-01.
- ^ a b "getopts". The Open Group (POSIX 2018).
- ^ "Bash Reference Manual".
- ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.
{{cite web}}
: CS1 maint : url-status (링크) - ^ a b Linux 일반 명령 설명서 –
- ^ "getopt(3)". Oracle Solaris 11.2 Information Library.
- ^ a b "ksh getopts -- parse options from shell script command line". www.mkssoftware.com.
- ^ Linux 일반 명령 설명서 –
- ^ "A simple CLI parser in Bash".
외부 링크
- 단일 UNIX 사양, Open Group의 문제 7 : 프로세스 명령줄 인수 – 명령 및 유틸리티 참조,