POSIX 쉘에서 getopts를 사용하여 전달된 옵션을 확인하는 방법은 무엇입니까? (보고, 계산 및 폐기합니다.)

POSIX 쉘에서 getopts를 사용하여 전달된 옵션을 확인하는 방법은 무엇입니까? (보고, 계산 및 폐기합니다.)

확인 통과 옵션 사용 방법getopts(맨 페이지)POSIX 쉘에서? (보고, 계산 및 폐기합니다.)

내 생각은 이렇습니다. 내 스크립트 중 상당수는 어떤 옵션도 사용하지 않습니다( -h도움을 주기 위한 것도 아니고 help직접 해당 옵션으로 전환합니다). 따라서 옵션(스위치)이 여러 개 제공되면 이를 계산하고 보고한 다음 (아무 작업도 수행하지 않고) 간단히 삭제하고 싶습니다.

, 하위 및 상위 ( ) 0-9는 물론 모두 포함해 보겠습니다 .a-zA-Z


고쳐 쓰다:내 스크립트 중 다수는 파일을 인수로 받아들이지도 않습니다. 이 스크립트의 경우도 마찬가지입니다.


용법도움말은 다음과 같습니다.

usage ()
{
cat << EOF
MPV video player subtitles enable/disable toggling
--------------------------------------------------
on              Enable  subtitles toggling in MPV.
off             Disable subtitles toggling in MPV.
help            Print this help message.
version         Print the script version.
EOF
}

답변1

스크립트가 어떤 옵션도 사용하지 않지만 어떤 옵션이 (잘못) 전달되었는지 확인하고 오류를 직접 처리하려는 경우 getopts옵션 사양 :$OPTARG.getopts유틸리티에 대한 POSIX 사양(강조):

옵션 문자가 포함되어 있지 않은 경우선택적 문자열옵션 문자가 예상되는 위치에서 피연산자가 발견되면 name으로 지정된 쉘 변수를 <물음표>( ?) 문자로 설정해야 합니다. 이 경우,첫 번째 문자인 경우선택적 문자열<콜론>( :)인 경우 쉘 변수는 OPTARG발견된 옵션 문자로 설정되어야 하지만 출력은 표준 오류에 기록되지 않습니다.;그렇지 않으면 쉘 변수를 설정 해제 OPTARG하고 진단 메시지를 표준 오류에 기록해야 합니다. 이 상황은 호출 애플리케이션에 매개변수가 제공되는 방식에서 감지된 오류로 간주되어야 하지만 getopts처리 중 오류가 되어서는 안 됩니다.

따라서 다음과 같이 작성할 수 있습니다.

optnum=0; while getopts : opt; do
    printf >&2 '%s\n' "Illegal option -$OPTARG"
    optnum=$(( optnum + 1 ))
done

if [ "$optnum" -gt 0 ]; then
    printf >&2 '%s\n' "Some ($optnum) option switches were passed to the script, but none expected!"
fi
shift "$(( OPTIND - 1 ))"
if [ "$#" -gt 0 ]; then
  echo "Non-option argument${2+s}:"
  printf ' - %s\n' "$@"
fi

예:

$ ./that-script -asd --output=asd -- rest
Illegal option -a
Illegal option -s
Illegal option -d
Illegal option --
Illegal option -o
Illegal option -u
Illegal option -t
Illegal option -p
Illegal option -u
Illegal option -t
Illegal option -=
Illegal option -a
Illegal option -s
Illegal option -d
Some (14) option switches were passed to the script, but none expected!
Non-option argument:
 - rest

그러나 옵션이 없는(그러나 여전히 처리 중인) 스크립트는 --일반적으로 다음과 같습니다.

PROGNAME=$0
usage() {
  printf >&2 '%s\n' "Usage: $PROGNAME [<file> [<file>...]]"
  exit 1
}
getopts '' opt && usage
shift "$(( OPTIND - 1))"

for file do
  printf 'Got "%s"\n' "$file"
done

그리고 첫 번째 오류에서 실패한 종료 상태로 종료하는 것이 가장 현명한 방법입니다.

$ ./that-script -weirdly-named-.txt
./that-script: illegal option -- w
Usage: ./that-script [<file> [<file>...]]
$ ./that-script -- -weirdly-named-.txt
Got "-weirdly-named-.txt"

getopts접두사를 생략하여 잘못된 옵션 자체에 대한 오류 메시지를 인쇄 합니다 :.

물론 옵션이 처리된 후 필요한 경우 나머지 매개변수의 유효성을 검사할 수 있습니다. 예를 들어, 스크립트가 옵션이 아닌 인수도 허용하는 경우 다음을 호출한 후 shift:

if [ "$#" -ne 0 ]; then
  echo>&2 'This script does not accept any argument.'
  usage
fi

실제로는 or 라고만 호출할 수 that-script있습니다 that-script --. getopts옵션, 옵션 구분 기호, 비옵션 매개변수 등 모든 매개변수를 건너뛰거나 거부할 수도 있습니다 .

또는 Usage: cmd [<type> <length> <value> [<type> <length> <value>]...]:

if [ "$(( $# % 3 ))" -ne 0 ]; then
  echo>&2 'The number of arguments must be a multiple of 3'
  usage
fi

등.

관련 정보