getopts는 어떤 순서로 명령줄 인수를 읽나요?

getopts는 어떤 순서로 명령줄 인수를 읽나요?

Bash 매뉴얼에 따르면

getopts optstring name [args]

옵션의 끝에 도달하면 getopts종료하고 0보다 큰 값을 반환합니다. OPTIND옵션이 아닌 첫 번째 인수의 인덱스로 설정하고 name로 설정합니다 ?.

그게 무슨 뜻인가요?

  • getopts옵션과 옵션 인수만 읽고 옵션도 옵션 인수도 아닌 인수는 읽지 않습니까?

  • getopts옵션도 옵션 인수도 아닌 일부 인수 뒤에 명령줄에서 일부 옵션을 지정하는 작업을 처리할 수 없습니까? 즉, getopts모든 옵션과 옵션 인수 다음에 옵션도 아니고 옵션 인수도 아닌 인수를 지정해야 합니까?

감사해요.

답변1

예, getoptsPOSIX 방식으로 옵션을 구문 분석하는 도구입니다( bashGNU 셸에서도 가능).

존재하다:

cmd -abc -dxx -e yy arg -f -g

(optspec은 :abcd:e:fg)

-f-g일반 매개변수입니다 . getopts그게 다야 arg.

일반적으로 말하면 다음과 같습니다.

while getopts...
  case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"

옵션이 아닌 인수 이후에 옵션이 고려되는 GNU 방식으로 옵션을 처리하려는 경우( --환경에 없거나 POSIXLY_CORRECT가 있는 경우 제외) 대신 util-linux또는 busybox 구현을 사용할 수 있습니다 getopt(다른 API 사용). 이 옵션은 긴 옵션도 지원합니다. 그러나 Linux 외부에서는 이식성이 없습니다.

다음과 같은 작업을 수행합니다.

parsed_opts=$(getopt -o abcd:e:fg -l long -- "$@") || usage
eval "set -- $parsed_opts"
for o do
  case $o in
    (-[abcfg]) echo "no-arg option: $o"; shift;;
    (--long) echo "long option"; shift;;
    (-[de]) printf '%s\n' "option $o with arg $2"; shift 2;;
    (--) shift; break;;
    (*) echo "never reached";;
  esac
done
echo Remaining args:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"

이 옵션에서는 해당 매개변수가 다소 재정렬되며 해당 매개변수는 "나머지 매개변수"에서 제거됩니다.

$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
 -a -e 'x' --long -- 'foo' 'bar' 'baz'

관련 정보