Bash 매뉴얼에 따르면
getopts optstring name [args]
옵션의 끝에 도달하면
getopts
종료하고 0보다 큰 값을 반환합니다.OPTIND
옵션이 아닌 첫 번째 인수의 인덱스로 설정하고name
로 설정합니다?
.
그게 무슨 뜻인가요?
getopts
옵션과 옵션 인수만 읽고 옵션도 옵션 인수도 아닌 인수는 읽지 않습니까?getopts
옵션도 옵션 인수도 아닌 일부 인수 뒤에 명령줄에서 일부 옵션을 지정하는 작업을 처리할 수 없습니까? 즉,getopts
모든 옵션과 옵션 인수 다음에 옵션도 아니고 옵션 인수도 아닌 인수를 지정해야 합니까?
감사해요.
답변1
예, getopts
POSIX 방식으로 옵션을 구문 분석하는 도구입니다( bash
GNU 셸에서도 가능).
존재하다:
cmd -abc -dxx -e yy arg -f -g
(optspec은 :abcd:e:fg
)
-f
-g
일반 매개변수입니다 . getopts
그게 다야 arg
.
일반적으로 말하면 다음과 같습니다.
while getopts...
case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
옵션이 아닌 인수 이후에 옵션이 고려되는 GNU 방식으로 옵션을 처리하려는 경우( --
환경에 없거나 POSIXLY_CORRECT가 있는 경우 제외) 대신 util-linux
또는 busybox 구현을 사용할 수 있습니다 getopt
(다른 API 사용). 이 옵션은 긴 옵션도 지원합니다. 그러나 Linux 외부에서는 이식성이 없습니다.
다음과 같은 작업을 수행합니다.
parsed_opts=$(getopt -o abcd:e:fg -l long -- "$@") || usage
eval "set -- $parsed_opts"
for o do
case $o in
(-[abcfg]) echo "no-arg option: $o"; shift;;
(--long) echo "long option"; shift;;
(-[de]) printf '%s\n' "option $o with arg $2"; shift 2;;
(--) shift; break;;
(*) echo "never reached";;
esac
done
echo Remaining args:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
이 옵션에서는 해당 매개변수가 다소 재정렬되며 해당 매개변수는 "나머지 매개변수"에서 제거됩니다.
$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
-a -e 'x' --long -- 'foo' 'bar' 'baz'