getopt를 사용하여 선택적 값이 있는 옵션

getopt를 사용하여 선택적 값이 있는 옵션

다음 함수가 있는데 이를 사용하여 선택적 값으로 옵션을 설정하는 방법을 알고 싶습니다 getopt.

-w기본값을 사용하고 싶습니다 .

region -w -- "Text"

여기에는 -w 1선택적 숫자 값이 필요합니다.

region -w 1 -- "Text"

여기서 기능

region ()
{
  # Process command line options
  shortopts="hw::"
  longopts="help,version,warning:"

  opts=$(getopt -o "$shortopts" -l "$longopts"  \
            -n "$(basename $0)" -- "$@")
  if [ $? -eq 0 ]; then
    eval "set -- ${opts}"
    while [ $# -gt 0 ]; do
      case "$1" in
      -h|-\?|--help)
        printf "%s\n" "Todo."
        shift
        break
        ;;
      -w|--warning)
        case "$2" in
          "1") local -r warn="first";  shift 2  ;;
            *) local -r warn="all";    shift 2  ;;
         esac
         local -r f=1
         ;;
      --)
         local -r f=1
         shift
         break
         ;;
      esac
    done
  else
    shorthelp=1 # getopt returned (and reported) an error.
  fi
    
}

답변1

아마도 이 답변이 마음에 들지 않을 것입니다. 선택적으로 인수를 취하는 옵션에 인수를 제공하려면 공백을 사용할 수 없습니다.

$ getopt -o 'w::' -- -w -- arg
 -w '' -- 'arg'

$ getopt -o 'w::' -- -w 1 -- arg
 -w '' -- '1' 'arg'

$ getopt -o 'w::' -- -w1 -- arg
 -w '1' -- 'arg'

마찬가지로 옵션 긴 인수의 경우 다음을 사용해야 합니다.=

$ getopt -o '' -l 'warning::' -- --warning -- arg
 --warning '' -- 'arg'

$ getopt -o '' -l 'warning::' -- --warning 1 -- arg
 --warning '' -- '1' 'arg'

$ getopt -o '' -l 'warning::' -- --warning=1 -- arg
 --warning '1' -- 'arg'

매뉴얼 페이지에서:

간단한 짧은 옵션은 "-" 뒤에 짧은 옵션 문자가 오는 것입니다. [...] 옵션에 선택적 인수가 있는 경우옵션 문자 바로 뒤에 써야 합니다.존재하는 경우.

긴 옵션은 일반적으로 '--'로 시작합니다. [...] 옵션에 선택적 인수가 있는 경우긴 옵션 이름 바로 뒤에 작성해야 하며 "="로 구분해야 합니다., 존재하는 경우("="를 추가하고 그 뒤에 아무것도 추가하지 않으면 매개변수가 없는 것처럼 해석됩니다. 이는 사소한 버그입니다. 버그를 참조하세요.)


코드 레이아웃에 대한 코드 검토 설명입니다. if-else-fi 구문에서는 짧은 분기를 먼저 배치하세요. 여기에 도착하면 상황이 어떤지 else기억하기 위해 스캔해야 합니다 .if

또한 이를 통해 "어설션" 스타일로 작성하고 함수의 "주" 코드를 줄일 수 있습니다.

region ()
{
  # Process command line options
  shortopts="hw::"
  longopts="help,version,warning:"

  opts=$(getopt -o "$shortopts" -l "$longopts"  \
            -n "$(basename $0)" -- "$@")
  if [ $? -ne 0 ]; then
    shorthelp=1 # getopt returned (and reported) an error.
    return
  fi

  eval "set -- $opts"
  # ...

또는 종료 상태를 직접 확인하고 여전히 변수에 할당할 수 있습니다. (여기서 기본 이름 호출도 제거했습니다.)

  if ! opts=$(getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@")
  then
    shorthelp=1 # getopt returned (and reported) an error.
    return
  fi

-w를 사용하여 level=1을 설정했습니다. 그렇지 않으면 -wNUM에 대해 level=NUM을 설정합니다.

  local level=0
  #...
      case "$1" in
      -w|--warning)
         level=${2:-"1"}
         ;;

즉, ${var:-default}매개변수 확장의 형태입니다.

관련 정보