getopts
이것이 내 Bash 스크립트 에 작동하는지 확인하려고 합니다 . 그러나 무엇이 잘못되고 있는지 잘 모르겠습니다.
#! /bin/bash
while getopts "a:b" opt ; do
case $opt in
a)
A_OPTION="option a was given argument $OPTARG"
;;
b)
B_OPTION="option b was found"
;;
esac
done
if [ -n "$A_OPTION" ] ; then echo $A_OPTION ; fi
if [ -n "$B_OPTION" ] ; then echo $B_OPTION ; fi
shift $((OPTIND - 1))
echo "The remaining arguments are: $@"
출력은 다음과 같습니다
$ ./getopts-test foo goo -a moo -b
The remaining arguments are: foo goo -a moo -b
$ ./getopts-test -a moo -b foo goo
option a was given argument moo
option b was found
The remaining arguments are: foo goo
$ ./getopts-test -a moo foo goo -b
option a was given argument moo
The remaining arguments are: foo goo -b
$ ./getopts-test -b foo goo -a moo
option b was found
The remaining arguments are: foo goo -a moo
스크립트가 모든 경우에 옵션을 감지하지 못하는 이유는 무엇입니까? getopts
옵션이 모두 미리 제공되고 다른 매개변수와 혼합되지 않은 경우에만 유용합니까?
답변1
(코멘트라기엔 너무 길고 답변이라기엔 너무 형편없네요)
getopt
-
(빼기 기호)가 있는 단일 문자 옵션과 매개변수가 있는 옵션을 감지해 보십시오 .
(더 이상) 옵션이 없으면(no -b
, no ) -a foo
중지됩니다 . 전체 목록을 구문 분석하지 않습니다.
따라서 두 번째 질문에 대한 대답은 '예'입니다.
getopt 파서를 직접 작성하고 -foo
--bar
인수(예: 파일, 문자열) 또는 옵션을 처리할 수 있습니다.
오랜 전통은 옵션을 먼저 배치하고 인수를 뒤에 배치하여 옵션이 중지되는 시기와 -foo
실제 파일 이름인지 여부를 알 수 있도록 하는 것입니다.
답변2
맨페이지에 따르면 이는 예상된 동작입니다. getopts
"옵션" 및 "옵션 매개변수"를 지원합니다.
지침 4: 모든 옵션은 로 시작해야 합니다 -
. 즉, ./getopts-test foo goo -a moo -b
"foo"는 옵션도 아니고 옵션 인수도 아니기 때문에 작동하지 않습니다. 따라서 중지됩니다.
옵션 매개변수는 ":"으로 지정됩니다. 귀하의 정의에는 a:
옵션 매개변수가 있으며 이는 에서 구문 분석되는 옵션 -a moo
일 b
뿐입니다 . 나머지( )만 남았습니다.-b
./getopts-test -a moo -b foo goo
foo goo
지침 8: 옵션 매개변수의 모든 매개변수는 쉼표로 구분되어야 합니다. 그렇기 때문에 ./getopts-test -a moo foo goo -b
구문 분석만 수행 -a moo
하는 것이 올바른 방법입니다 ./getopts-test -a moo,foo,goo -b
. (마지막 사례에도 동일하게 적용됩니다)
인용하다: