게토프

getopts
게토프
개발자다양한 오픈 소스상업용 개발자
초기 릴리즈1986; 36년 전 (1998년)
운영 체제Unix, Unix 유사, IBM i
유형명령

getopts 명령줄 인수를 구문 분석하기 위한 기본 제공 Unix 셸 명령.getopt의 C 인터페이스를 기반으로 POSIX 유틸리티 구문 가이드라인을 따르는 명령행 인수를 처리하도록 설계되었다.

의 전임자.getopts유닉스 시스템 연구소의 외부 프로그램이었다.

역사

원본getopt몇 가지 문제가 있었다: 그것은 논쟁에서 공백이나 껍질 메타캐랙터를 다룰 수 없었고, 오류 메시지의 출력을 비활성화할 수 있는 능력이 없었다.[1]

getopts1986년에 Unix SVR3와 함께 선적된 Bourne shell에 처음 도입되었다.현재 및 인수 위치의 위치를 추적하기 위해 쉘의 자체 변수를 사용한다.OPTINDOPTARG를 선택하고 셸 변수의 옵션 이름을 반환하십시오.[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]

KornShellZsh는 둘 다 긴 논쟁을 위한 확장을 가지고 있다.전자는 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=("$@")

참고 항목

참조

  1. ^ a b c getopt(1)FreeBSD 일반 명령 설명서
  2. ^ Mascheck, Sven. "The Traditional Bourne Shell Family". Retrieved 2010-12-01.
  3. ^ a b "getopts". The Open Group (POSIX 2018).
  4. ^ "Bash Reference Manual".
  5. ^ IBM. "IBM System i Version 7.2 Programming Qshell" (PDF). Retrieved 2020-09-05.{{cite web}}: CS1 maint : url-status (링크)
  6. ^ a b getopt(1)Linux 일반 명령 설명서
  7. ^ "getopt(3)". Oracle Solaris 11.2 Information Library.
  8. ^ a b "ksh getopts -- parse options from shell script command line". www.mkssoftware.com.
  9. ^ zshmodules(1)Linux 일반 명령 설명서
  10. ^ "A simple CLI parser in Bash".

외부 링크