getopts 간이 튜 토리 얼 (Small getopts tutorial) 번역문

8588 단어 bashgetopts
getopts 간이 강좌
명령 행 인 자 를 전문 적 으로 분석 하고 싶 을 때 getopts 는 선택 할 도구 입 니 다.이전 버 전의 형제 명령 getopt 와 달리 getopts 는 셸 내 장 된 명령 입 니 다.고급
  • 외부 명령 을 통 해 인 자 를 전달 할 필요 가 없습니다
  • getopts 는 파 라 메 터 를 분석 할 수 있 는 변 수 를 쉽게 설정 할 수 있 습 니 다. (외부 프로그램 에 서 는 불가능 합 니 다!)
  • 과거 getopt 를 사 용 했 을 때의 bug 구현 (빈 칸,...)
  • 을 처리 할 필요 가 없습니다.
  • getopts 는 이미 POSIX 에 있 습 니 다.®정의
  • 위치 파 라 메 터 를 분석 하 는 다른 방법 (getopt (s) 을 사용 하지 않 음) 은 위치 파 라 메 터 를 어떻게 처리 하 는 지 소개 합 니 다.
    getopts 는 GNU 스타일 의 긴 옵션 (-- my option) 이나 XF 86 스타일 의 긴 옵션 (- my option) 을 해석 할 수 없습니다!
    소개 하 다.
    술어
    우리 가 여기 서 토론 하 는 일 을 먼저 알 아야 하기 때문에 범례 를 살 펴 보 자. 다음 명령 을 살 펴 보 자.
    mybackup -x -f /etc/mybackup.conf -r ./foo.txt ./bar.txt
    

    이 모든 것 을 위치 매개 변수 라 고 하지만 논리 그룹 으로 나 눌 수 있 습 니 다.
  • - x 는 하나의 옵션, 하나의 표지, 하나의 스위치: 하나의 문자, 하나의 앞 에 짧 은 횡 봉 (-)
  • 을 유도 합 니 다.
  • - f 도 하나의 옵션 이지 만 이 옵션 은 추가 매개 변수 (- f 옵션 에 전달 하 는 매개 변수) 가 있 습 니 다./etc/my backup. conf.이 매개 변 수 는 보통 매개 변수 와 분 리 됩 니 다 (빈 칸 이나 다른 구분자 사용). 그러나 이것 은 필요 한 것 이 아 닙 니 다. - f/etc/my backup. conf 도 합 법 적 입 니 다.
  • - r 는 설정 에 의존 합 니 다.이 범례 에서 - r 는 인자 가 필요 하지 않 기 때문에 독립 된 옵션 입 니 다. 예 를 들 어 - x
  • ./foo. txt 와./bar. txt 는 남 은 매개 변수 로 어떠한 옵션 과 도 연결 되 지 않 습 니 다.보통 집합 매개 변수 (예 를 들 어 cp (1) 에 지정 한 파일 이름) 나 옵션 이 필요 없 는 매개 변수 로 사 용 됩 니 다. 프로그램의 미리 정 의 된 형식 (텍스트 편집기 에 전달 한 파일 이름 매개 변수 처럼 텍스트 를 열 고 표시 하 는 데 사 용 됩 니 다. - 왜 이마 밖의 스위치 가 필요 합 니까?) 입 니 다. POSIX®그것들 을 조작 대상 으로 호출
  • getopts 가 왜 유용 한 지 알 아 보 겠 습 니 다. 위의 명령 은 이렇게 읽 을 수 있 습 니 다.
    mybackup -xrf /etc/mybackup.conf ./foo.txt ./bar.txt
    

    자신의 코드 를 사용 하여 해석 하 는 것 은 매우 어렵다.getopts 는 모든 일반적인 옵션 형식 을 알 아 볼 수 있 습 니 다.
    옵션 표 지 는 대소 문자 도 있 고 숫자 도 있 습 니 다.심지어 다른 식별 가능 한 문자 도 있 지만 이렇게 하 는 것 을 추천 하지 않 습 니 다 (가용성 이 떨 어 지고 특수 문자 에 문제 가 생 길 수 있 습 니 다).
    의 원리
    보통 getopts 를 여러 번 호출 해 야 합 니 다.매번 '다음' 위치 매개 변수 (가능 한 추가 매개 변수) 를 사용 합 니 다. 분석 에 성공 하면 결 과 를 되 돌려 줍 니 다.getopts 는 위치 매개 변수 설정 을 바 꾸 지 않 습 니 다. shift 에서 인 자 를 떨 어 뜨리 려 면 수 동 으로 처리 해 야 합 니 다.
    shift $((OPTIND-1))
    # now do something with $@
    

    getopts 는 분석 할 인자 가 남 아 있 지 않 을 때 종료 상태 FALSE 로 되 돌아 가기 때문에 while 순환 에서 쉽게 사용 할 수 있 습 니 다.
    while getopts ...; do
      ...
    done
    

    getopts 는 옵션 과 가능 한 인 자 를 분석 합 니 다.첫 번 째 옵션 이 아 닌 인 자 를 만 났 을 때 해석 을 중단 합 니 다. (연결 문자 (-) 로 시작 하지 않 는 문자열 입 니 다. 이것 은 앞의 모든 옵션 의 인자 가 아 닙 니 다.)이 의 미 는 옵션 이 종료 되 었 기 때문에 -- (이중 연결 문자) 를 볼 때 해석 을 중단 합 니 다.
    유용 한 변수
    변량
    묘사 하 다.
    OPTIND
    다음 분석 할 인자 의 지침 을 저장 합 니 다.이것 이 바로 getopts 가 자신의 상태 와 반전 요 구 를 어떻게 기억 하 는 지 입 니 다.getopts 처리 후 shift 에서 위치 변 수 를 떨 어 뜨리 는 데 도 사용 할 수 있 습 니 다.OPTIND 는 처음에 1 이 었 습 니 다. getopts 를 다시 사용 하여 모든 인 자 를 분석 하려 면 1 로 다시 설정 해 야 합 니 다.
    OPTARG
    이 변 수 는 getopts 에서 발 견 된 옵션 의 인자 로 설정 되 어 있 습 니 다.알 수 없 는 옵션 표시 도 포함 되 어 있 습 니 다.
    OPTERR
    (선택 값 0 또는 1) Bash 가 getopts 에 내 장 된 오류 정 보 를 표시 해 야 하 는 지 여부 입 니 다.이 값 은 셸 이 시 작 될 때마다 1 로 초기 화 됩 니 다. - 그 러 니 귀 찮 은 정 보 를 보고 싶 지 않 으 면 0 으로 설정 하 세 요!
    getopts 역시 이 변 수 를 오류 보고 에 사용 합 니 다 (they 're set to value - combinations which arent possible in normal operation).\# 괄호 안에 있 는 것 은 번역 되 지 않 고 예약 합 니 다.
    네가 하고 싶 은 것 을 가리키다
    getopts 의 기본 문법 은:
    getopts OPTSTRING VARNAME [ARGS...]
    

    설명:
    OPTSTRING
    getopts 가 원 하 는 옵션 과 원 하 는 인자 가 어디 에 있 는 지 알려 줍 니 다 (아래 참조)
    VARNAME
    getopts 에 옵션 보고서 에 사용 할 셸 변 수 를 알려 줍 니 다.
    ARG
    getopts 에 위치 매개 변수 가 아 닌 추가 단어 로 해석 하 라 고 알려 주세요.
    option-string
    option - string 은 getopts 가 원 하 는 옵션 을 알려 주 고 어떤 옵션 에 인자 가 있어 야 하 는 지 알려 줍 니 다.문법 은 매우 간단 합 니 다 - 모든 알파벳 은 옵션 이름 자체 입 니 다. 아래 의 범례 는 getopts 에 게 - f, - A 와 - x 를 찾 는 것 을 알려 줍 니 다.
    getopts fAx VARNAME
    

    getopts 가 어떤 옵션 에 인 자 를 기대 하 게 하려 면 이 옵션 표시 뒤에 만: (콜론) 을 설치 하 십시오.만약 에 - A 가 하나의 인자 (예 를 들 어 - A SOMETHING) 를 원한 다 면:
    getopts fA:x VARNAME
    

    option - string 의 첫 번 째 자모 가: (사칭) 이 라면 보통 터 무 니 없 는 것 입 니 다. 그 전에 옵션 이 없 기 때문에 getopts 는 '침묵 오류 보고' 모드 로 전환 합 니 다.제품 스 크 립 트 에서 이것 은 보통 당신 이 원 하 는 결과 입 니 다.
    사용자 정의 매개 변수 분석
    getopts 도 구 는 현재 셸 이나 함수 의 위치 매개 변 수 를 기본 으로 해석 합 니 다 ('$@' 을 의미 합 니 다).
    매개 변 수 를 분석 할 수 있 습 니 다. 부가 매개 변 수 는 VARNAME 매개 변수 다음 에 제 시 될 때 getopts 는 이 위치 변 수 를 분석 하려 고 하지 않 습 니 다.
    이런 방식 으로 당신 이 좋아 하 는 방식 으로 모든 옵션 을 해석 할 수 있 습 니 다. 여 기 는 배열 의 범례 입 니 다.
    while getopts :f:h opt "${MY_OWN_SET[@]}"; do
      ...
    done
    

    이 추가 매개 변 수 를 가지 고 getopts 를 호출 하지 않 는 방식 은 명시 적 사용 "$@"호출:
    getopts ... "$@"
    

    오류 보고
    오류 보고 에 대해 getops 는 두 가지 모드 에서 실행 할 수 있 습 니 다.
  • 상세 모드
  • 조용 모드
  • 제품 스 크 립 트 에 대해 서 는 침묵 모드 를 사용 하 는 것 을 권장 합 니 다. 더 전문 적 으로 보이 기 때문에 더 많은 귀 찮 은 정 보 를 보고 싶 지 않 습 니 다. 마찬가지 로 처리 하기 도 쉽 고 실패 한 사례 는 더 간단 한 방식 으로 표 시 됩 니 다.
    상세 모드
    invalid option
    VARNAME is set to ? (quersion-mark) and OPTARG is unset
    required argument not found
    VARNAME is set to ? (quersion-mark), OPTARG is unset and an error message is printed
    조용 모드
    invalid option
    VARNAME is set to ? (question-mark) and OPTARG is set to the (invalid) option character
    required argument not found
    VARNAME is set to : (colon) and OPTARG contains the option-character in question
    시작 하 다
    첫 번 째 예
    몇 가지 문 제 를 충분히 설명 할 수 있다!
    아주 간단 한 인 스 턴 스 를 먼저 보 겠 습 니 다. 원 하 는 옵션 (- a) 만 있 고 인자 가 없습니다. 마찬가지 로 저 희 는 테이프: (콜론) option string 을 사용 하여 자세 한 오 류 를 사용 하지 않 습 니 다.
    #!/bin/bash
    
    while getopts ":a" opt; do
      case $opt in
        a)
          echo "-a was triggered!" >&2
          ;;
        \?)
          echo "Invalid option: -$OPTARG" >&2
          ;;
      esac
    done
    

    나 는 이 내용 을 파일 go test. sh 에 넣 었 는데, 바로 네가 다음 에 본 범례 중의 이름 이다.
    테스트 를 해 보 겠 습 니 다.
    매개 변수 호출 없 음
    $ ./go_test.sh
    $ 
    

    아무 일 도 일어나 지 않 았 습 니까? 맞습니다. getopts 는 합 법 적 이거 나 불법 적 인 옵션 (앞 에 짧 은 가로줄 이 있 는 알파벳) 을 보지 못 했 기 때문에 촉발 되 지 않 습 니 다.
    옵션 이 아 닌 인자 로 호출
    $ ./go_test.sh /etc/passwd
    $ 
    

    아니면 - 아무 일 도 일어나 지 않 았 습 니 다. 매우 유사 한 용례: getopts 는 합 법 적 이거 나 불법 적 인 옵션 (앞 에 짧 은 가로줄 의 자모 가 있 음) 을 보지 못 했 기 때문에 촉발 되 지 않 습 니 다.
    당신 에 게 전 달 된 스 크 립 트 의 인 자 는 당연히 $1 - ${N} 로 가 져 올 수 있 습 니 다.
    옵션 매개 변수 로 호출
    이제 getopts: 옵션 을 터치 합 니 다.
    우선, 불법 으로:
    $ ./go_test.sh -b
    Invalid option: -b
    $ 
    

    예상대로 getopts 는 이 옵션 을 허용 하지 않 습 니 다. 위 에서 말 한 것 처럼: It placed? into $opt and the invalid option character (b) into $OPTARG. 우리 의 사례 는 이 점 을 검증 합 니 다.
    지금 합 법 적 인 (- a):
    $ ./go_test.sh -a
    -a was triggered!
    $ 
    

    이 탐측 결 과 는 완벽 하 게 작 동 하 는 것 을 보 았 습 니 다. 우리 의 용례 a 옵션 은 변수 $opt 에 놓 여 있 습 니 다.
    물론 호출 할 때 유효 하고 잘못된 옵션 을 조합 할 수 있 습 니 다.
    $ ./go_test.sh -a -x -b -c
    -a was triggered!
    Invalid option: -x
    Invalid option: -b
    Invalid option: -c
    $ 
    

    마지막 으로 자 연 스 럽 게 우리 의 옵션 을 여러 번 제시 할 수 있다.
    $ ./go_test.sh -a -a -a -a
    -a was triggered!
    -a was triggered!
    -a was triggered!
    -a was triggered!
    $ 
    

    마지막 예 는 우리 로 하여 금 몇 가 지 를 고려 해 야 하 게 한다.
  • 무효 옵션 은 처리 과정 을 멈 추 지 않 습 니 다. 스 크 립 트 를 멈 추 려 면 스스로 처리 해 야 합 니 다 (정확 한 위치 에서 종료)
  • 여러 개의 같은 옵션 이 가능 합 니 다. 만약 당신 이 이렇게 하 는 것 을 허락 하지 않 는 다 면, 당신 은 스스로 검 측 해 야 합 니 다 (예 를 들 어 변수 나 다른 방식 을 설정 해 야 합 니 다)
  • 인자 가 있 는 옵션
    위의 예 를 확장 합 시다. 조금 만:
  • - a 인자 가 필요 합 니 다 - a now takes an argument
  • 오류 가 발생 했 습 니 다. 분석 과정 은 exit 1 로 종료 합 니 다
  • #!/bin/bash
    
    while getopts ":a:" opt; do
      case $opt in
        a)
          echo "-a was triggered, Parameter: $OPTARG" >&2
          ;;
        \?)
          echo "Invalid option: -$OPTARG" >&2
          exit 1
          ;;
        :)
          echo "Option -$OPTARG requires an argument." >&2
          exit 1
          ;;
      esac
    done
    

    마지막 범례 와 같은 테스트 를 계속 합 시다.
    매개 변수 호출 없 음
    $ ./go_test.sh
    $ 
    

    위 와 같이 아무 일 도 일어나 지 않 았 다. 촉발 되 지 않 았 다.
    옵션 이 아 닌 인자 로 호출
    $ ./go_test.sh /etc/passwd
    $ 
    

    매우 유사 한 상황: 촉발 되 지 않 았 습 니 다.
    매개 변수 옵션 호출
    불법 옵션:
    $ ./go_test.sh -b
    Invalid option: -b
    $ 
    

    기 대 했 던 것 처럼 getopts 는 이 옵션 을 허용 하지 않 습 니 다. 프로그램 알고리즘 과 일치 합 니 다.
    합 법 적 인 옵션 이지 만 강제 적 으로 요구 되 는 인자 가 없습니다:
    $ ./go_test.sh -a
    Option -a requires an argument.
    $ 
    

    OK 를 선택 하 였 으 나 인 자 를 잃 어 버 렸 습 니 다.
    이 인 자 를 제공 합 니 다:
    $ ./go_test.sh -a /etc/passwd
    -a was triggered, Parameter: /etc/passwd
    $
    

    참고 자료
  • Internal: Handling positional parameters
  • Internal: The case statement
  • Internal: The while-loop
  • POSIX getopts(1) and getopt(3)
  • 좋은 웹페이지 즐겨찾기