getopts OPTIND 작동 방식

getopts OPTIND 작동 방식

OPTIND나는 그것이 어떻게 작동하는지 이해하고 싶습니다 getopts. 처음 몇 개의 위치 매개변수를 건너뛰려면 어떻게 설정해야 합니까 OPTIND?

그리고 OPTIND는 자동으로 재설정되지 않기 때문에 getopts에 대한 여러 호출 간에 수동으로 정확하게 재설정하는 방법을 알아야 합니다.

첫 번째 호출에서 보고된 오류를 받았기 때문입니다.

gopi -z
/usr/local/bin/bash: option requires an argument -- z

그러나 두 번째로 호출했을 때 오류가 보고되지 않았습니다.

gopi -z

이것은 기능입니다

 gopi ()
 {

  local parg=""
  while (( $# > 0 )); do
    parg="$1"
    case $parg in
     ("-s"|"--silent") opstring=":n:z:" ;;
     (*) break ;;
    esac  # case ends here
    shift 1
  done
 
  while getopts "$opstring" opname; do
   case ${opname} in
     ("n") dothis ;;
     ("z") dothat ;;
     (?)
       ## Invalid Option Found
       echo "Invalid option: -$OPTARG" 1>&2
       exit 1
       ;;
     (:)
       ## Required option argument not found
       echo "Option -$OPTARG requires an argument" 1>&2
       exit 1
       ;;
   esac
  done
 }

답변1

그리고 OPTIND는 자동으로 재설정되지 않기 때문에 getopts에 대한 여러 호출 간에 수동으로 정확하게 재설정하는 방법을 알아야 합니다.

Bash의 매뉴얼 페이지에는 다음과 같이 나와 있습니다( getopts설명 아래).

OPTIND쉘 또는 쉘 스크립트가 호출될 때마다 1로 초기화됩니다.

이는 재설정이 1작동해야 함을 의미합니다.이는 POSIX 설명에서 더 명확하게 설명됩니다.getopts:

애플리케이션이 설정된 경우선택값 1의 경우 새 매개변수 세트(현재 위치 매개변수 또는 새 인수 값)를 사용할 수 있습니다. 단일 쉘 실행 환경에서 모든 호출에서 동일하지 않은 인수(위치 인수 또는 인수 피연산자)를 사용하여 getopts를 여러 번 호출하려는 기타 모든 시도 또는 다음을 사용하여 getopts를 여러 번 호출하려는 시도선택값을 1이 아닌 값으로 수정하면 지정되지 않은 결과가 생성됩니다.

여기서 두 번째 호출에서는 foo첫 번째 인수가 누락되었지만 -a마지막 호출에서는 foo두 인수가 모두 다시 표시됩니다.

foo() {
    echo --
    while getopts abc opt; do
        echo $opt
    done
}
foo -abc
foo -a -b
OPTIND=1
foo -a -b

OPTIND=1물론, 호출하기 전에 함수 시작 부분에 설정하는 것이 더 합리적입니다 getopts.


연구된 값은 별로 유용하지 않습니다 OPTIND. 이는 개별 명령줄 인수 내의 위치에 대한 정보를 포함하지 않기 때문에 완전한 진실이 아닙니다. 예를 들어, 위의 첫 번째 호출에서 매개변수를 사용하여 -abc루프 내부에 1, 1, 2 값을 취하면 현재 문자 위치가 표시되지 않습니다. (Bash와 ksh에서는 함수 입력 시 Zsh가 재설정되는 것처럼 보이는 반면, yash는 값의 인수 내 위치를 인코딩합니다.)fooOPTINDOPTINDOPTIND

관련 정보