확인 통과 옵션 사용 방법getopts
(맨 페이지)POSIX 쉘에서? (보고, 계산 및 폐기합니다.)
내 생각은 이렇습니다. 내 스크립트 중 상당수는 어떤 옵션도 사용하지 않습니다( -h
도움을 주기 위한 것도 아니고 help
직접 해당 옵션으로 전환합니다). 따라서 옵션(스위치)이 여러 개 제공되면 이를 계산하고 보고한 다음 (아무 작업도 수행하지 않고) 간단히 삭제하고 싶습니다.
, 하위 및 상위 ( ) 0-9
는 물론 모두 포함해 보겠습니다 .a-z
A-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
등.