getopts가 두 번째 인수와 일치하지 않습니다.

getopts가 두 번째 인수와 일치하지 않습니다.

다음과 같은 스크립트를 얻으려고 합니다.

  • -q옵션을 사용하여 변수 설정
  • 옵션에 대한 도움말 표시 -h
  • 다른 옵션은 실패 -*하지만 위치 인수는 허용됩니다.

이것은 getopts내가 사용하는 스니펫입니다.

while getopts qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
    shift
done

echo "unparsed: $*"

이것은 매우 간단한 것 같습니다. 그러나 단일 매개변수를 제공하거나 a.sh -q예상 a.sh -h되는 작업을 수행하는 경우에만 작동합니다.

그러나 두 개의 인수를 제공하거나 $2에 인식할 수 없는 인수를 제공하면 아무 작업도 수행되지 않습니다.

$ ./a.sh -b
unrecognized option -- b

$ ./a.sh -q -b
unparsed: -b

$ ./a.sh -h -k
this is my help message
unparsed: -k

왜 두 번째 매개변수($2)가 getopts 루프에서 처리되지 않는지 아시나요?

답변1

명령이 shift잘못되었습니다. 그것은해야한다외부원형 while. 노력하다:

while getopts :qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
done
shift $((OPTIND - 1))

echo "unparsed: $*"

코드 시작 부분에 다음 줄을 추가하면:

usage() { echo "this is my help message"; }

그런 다음 다음 테스트를 수행할 수 있습니다.

$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message

관련 정보