getopts가 작동하지 않는 것 같습니다

getopts가 작동하지 않는 것 같습니다

옵션을 구문 분석하기 위해 다음 스크립트를 실행하려고 하는데 getopts작동하지 않는 것 같습니다.

#!/bin/bash
set -x
echo $@
while getopts "rf" opt
do
  case "${opt}" in
    r)
        ropt=${OPTARG}
        ;;
    f)
        fopt=${OPTARG}
        ;;
  esac
done

shift $((OPTIND -1))

echo $fopt $ropt

내가 얻는 결과는 다음과 같습니다.

$ ./myscript.sh -f opt2 -r opt1
+ echo -f opt2 -r opt1
-f opt2 -r opt1
+ getopts rf opt
+ case "${opt}" in
+ fopt=
+ getopts rf opt
+ shift 1
+ echo

+ set +x

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

답변1

옵션이 옵션 인수를 사용하기를 원하지만 getopts이를 알리지 않습니다.

당신은 사용해야합니다

while getopts "r:f:" opt; do ...; done

즉, 매개변수가 있는 각 옵션은 :매개변수 문자열 다음에 와야 합니다 getopts.

당신은 또한기본 case유효하지 않은 옵션을 처리하는 마지막 분기:

 *) usage >&2
    exit 1

(잘못된 옵션 또는 누락된 옵션 인수에 대한 오류 메시지는 간단한 도움말 메시지를 표준 출력으로 인쇄하기 위해 정의한 함수에서 예상되는 자체적으로 표시됩니다. getopts)usage

또한, 큰따옴표를 잊지 마세요.모두확장, 심지어 $(( OPTIND - 1 )).

마지막 요점과 관련:

관련 정보