getopt 선택적 값이 있는 선택적 매개변수

getopt 선택적 값이 있는 선택적 매개변수

사용 중이며 선택적 값이 있는 옵션을 getopt갖고 싶습니다 . 매개변수 값을 제공하지 않고 개별적으로 일치시킬 -l때 여전히 하나의 . 어떻게 이런일이 일어 났습니까?-lshift 2shift

opts=$( getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@" ) 
eval "set -- ${opts}"
while (( $# > 0 )); do
  case $1 in
    ("-l")
      case "$2" in
        (+([[:digit:]]))
          # matches -lNUM, optional argument value
          nl="$2"; shift 2 ;;
        (*)
          # matches -l, no argument value provided
          nl=1 ; shift ;;
        esac
        ;;
      ("--") shift ; break ;;
      (*) opt_error=1 ; break ;;
    esac
  done

답변1

man getopt해당 섹션 아래를 보면 OUTPUT다음과 같은 내용이 표시됩니다.

옵션이 선택적 인수를 취하고 인수를 찾을 수 없는 경우 다음 인수가 생성되지만 인용 모드에서는 비어 있지만 인용되지 않은(호환성) 모드에서는 두 번째 인수가 생성되지 않습니다.

이는 (호환 모드에서 실행하지 않고 레거시가 아닌 스크립트에 대해 그렇게 할 이유가 거의 없는 경우) getopt매개변수가 옵션에 대해 비어 있거나 선택적 값으로 생성되고 추가됨을 의미합니다. 옵션 바로 뒤의 매개변수 목록에 추가됩니다.

즉, 옵션 뒤에는 항상 인수가 있으므로 항상 가 필요합니다 shift 2.

그런데 선택적 매개변수의 경우 nlwhile/case 루프 전에 기본값으로 설정하거나 기본값으로 매개변수 확장을 사용해야 합니다. 예를 들어

nl="${2:-default_value}"

동일한 Case 문에서 짧은 옵션과 긴 옵션도 테스트해야 합니다. 그렇지 않으면 길고 짧은 변형을 처리하기 위해 불필요하게 코드를 복제하게 됩니다. 예를 들어:

-l|--long) ... ;;

관련 정보