"getopts"는 모든 옵션이 미리 제공되는 경우에만 유용합니까?

"getopts"는 모든 옵션이 미리 제공되는 경우에만 유용합니까?

getopts이것이 내 Bash 스크립트 에 작동하는지 확인하려고 합니다 . 그러나 무엇이 잘못되고 있는지 잘 모르겠습니다.

#! /bin/bash

while getopts "a:b" opt ; do
    case $opt in
        a)
            A_OPTION="option a was given argument $OPTARG"
            ;;
        b)
            B_OPTION="option b was found"
            ;;
    esac
done
if [ -n "$A_OPTION" ] ; then echo $A_OPTION ; fi
if [ -n "$B_OPTION" ] ; then echo $B_OPTION ; fi
shift $((OPTIND - 1))
echo "The remaining arguments are: $@"

출력은 다음과 같습니다

$ ./getopts-test foo goo -a moo -b
The remaining arguments are: foo goo -a moo -b
$ ./getopts-test -a moo -b foo goo
option a was given argument moo
option b was found
The remaining arguments are: foo goo
$ ./getopts-test -a moo foo goo -b
option a was given argument moo
The remaining arguments are: foo goo -b
$ ./getopts-test -b foo goo -a moo
option b was found
The remaining arguments are: foo goo -a moo

스크립트가 모든 경우에 옵션을 감지하지 못하는 이유는 무엇입니까? getopts옵션이 모두 미리 제공되고 다른 매개변수와 혼합되지 않은 경우에만 유용합니까?

답변1

(코멘트라기엔 너무 길고 답변이라기엔 너무 형편없네요)

getopt-(빼기 기호)가 있는 단일 문자 옵션과 매개변수가 있는 옵션을 감지해 보십시오 .

(더 이상) 옵션이 없으면(no -b, no ) -a foo중지됩니다 . 전체 목록을 구문 분석하지 않습니다.

따라서 두 번째 질문에 대한 대답은 '예'입니다.

getopt 파서를 직접 작성하고 -foo --bar인수(예: 파일, 문자열) 또는 옵션을 처리할 수 있습니다.

오랜 전통은 옵션을 먼저 배치하고 인수를 뒤에 배치하여 옵션이 중지되는 시기와 -foo실제 파일 이름인지 여부를 알 수 있도록 하는 것입니다.

답변2

맨페이지에 따르면 이는 예상된 동작입니다. getopts"옵션" 및 "옵션 매개변수"를 지원합니다.

지침 4: 모든 옵션은 로 시작해야 합니다 -. 즉, ./getopts-test foo goo -a moo -b"foo"는 옵션도 아니고 옵션 인수도 아니기 때문에 작동하지 않습니다. 따라서 중지됩니다.

옵션 매개변수는 ":"으로 지정됩니다. 귀하의 정의에는 a:옵션 매개변수가 있으며 이는 에서 구문 분석되는 옵션 -a moob뿐입니다 . 나머지( )만 남았습니다.-b./getopts-test -a moo -b foo goofoo goo

지침 8: 옵션 매개변수의 모든 매개변수는 쉼표로 구분되어야 합니다. 그렇기 때문에 ./getopts-test -a moo foo goo -b구문 분석만 수행 -a moo하는 것이 올바른 방법입니다 ./getopts-test -a moo,foo,goo -b. (마지막 사례에도 동일하게 적용됩니다)

인용하다:

관련 정보