첫 번째 문자가 (콜론)인 getopts 옵션 문자열의 목적은 무엇입니까?

첫 번째 문자가 (콜론)인 getopts 옵션 문자열의 목적은 무엇입니까?

옵션 문자열에 사용되는 경우 getopts다음에서 옵니다.http://wiki.bash-hackers.org/howto/getopts_tutorial

옵션 문자열의 첫 번째 문자가 (콜론)인 경우, 앞에 옵션 문자가 없기 때문에 일반적으로 의미가 없습니다. getopts는 다음으로 전환합니다."자동 오류 보고 모드". 효율적인 스크립트에서는 일반적으로 이것이 원하는 것입니다.이를 통해 귀찮은 메시지로 인해 방해받지 않고 오류를 직접 처리할 수 있습니다.

다음이 무엇을 의미하는지 알고 싶습니다.

  • "자동 오류 보고 모드"

  • "귀찮은 메시지로 인해 방해받지 않고 스스로 오류를 처리할 수 있게 해줍니다"?

몇 가지 예를 들어주실 수 있나요?

답변1

의 첫 번째 문자 optstring가 콜론인 경우 getopts누락된 옵션 매개변수 또는 유효하지 않은 옵션에 대한 진단 메시지가 생성되지 않습니다.

이는 스크립트에 의해 생성된 진단 메시지에 대해 더 많은 제어가 필요한 경우 또는 사용자가 불안정한 명령줄 옵션을 제공하고 표준 오류 스트림에 아무 것도 표시되는 것을 원하지 않는 경우 유용할 수 있습니다.

자동 보고 모드(처음에는 :)에서 잘못된 옵션에 대해 사용자에게 경고하려면 ?에 전달된 변수를 살펴봐야 합니다 getopts. 마찬가지로 누락된 옵션 매개변수의 경우 :두 오류 모두 일반적 getopts으로 자체적으로 처리되지만 사용자에게 자체 오류를 보고하려면 올바른 진단 메시지를 제공할 수 있도록 이러한 오류를 별도로 포착해야 합니다.

비자동 보고 모드에는 getopts표준 오류에 대한 자체 오류 보고가 있으며 *"모든 오류"만 포착합니다.

다음 두 가지 예를 비교해 보세요.

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a) printf 'Got a: "%s"\n' "$OPTARG" ;;
        b) printf 'Got b: "%s"\n' "$OPTARG" ;;
        *) echo 'some kind of error' >&2
           exit 1
    esac
done

사건 *적발어느명령줄 구문 분석 오류입니다.

$ bash script.sh -a
script.sh: option requires an argument -- a
some kind of error
$ bash script.sh -c
script.sh: illegal option -- c
some kind of error
#!/bin/bash

while getopts ':a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        :)  echo 'missing argument!' >&2
            exit 1 ;;
        \?) echo 'invalid option!' >&2
            exit 1
    esac
done

위의 사례는 :인수 누락 오류를 포착하는 반면, ?잘못된 옵션 오류를 포착하는 경우입니다( ?리터럴과 일치하려면 이스케이프하거나 인용해야 합니다 ?. 그렇지 않으면 단일 문자와 일치합니다).

$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!

답변2

무음, getopts인쇄 오류 메시지:

$ bash -c 'getopts a opt' getopts_test -b
getopts_test: illegal option -- b

자동, getopts자체적으로 인쇄되지 않음:

$ bash -c 'getopts :a opt' getopts_test -b
$

따라서 자동 모드에 콜론을 사용하면 수정된 메시지 대신 원하는 방식으로 스크립트에서 자체 오류를 인쇄할 수 있습니다.

#!/bin/bash
while getopts :a opt; do
    [[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
done

관련 정보