사용 중이며 선택적 값이 있는 옵션을 getopt
갖고 싶습니다 . 매개변수 값을 제공하지 않고 개별적으로 일치시킬 -l
때 여전히 하나의 . 어떻게 이런일이 일어 났습니까?-l
shift 2
shift
opts=$( getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@" )
eval "set -- ${opts}"
while (( $# > 0 )); do
case $1 in
("-l")
case "$2" in
(+([[:digit:]]))
# matches -lNUM, optional argument value
nl="$2"; shift 2 ;;
(*)
# matches -l, no argument value provided
nl=1 ; shift ;;
esac
;;
("--") shift ; break ;;
(*) opt_error=1 ; break ;;
esac
done
답변1
man getopt
해당 섹션 아래를 보면 OUTPUT
다음과 같은 내용이 표시됩니다.
옵션이 선택적 인수를 취하고 인수를 찾을 수 없는 경우 다음 인수가 생성되지만 인용 모드에서는 비어 있지만 인용되지 않은(호환성) 모드에서는 두 번째 인수가 생성되지 않습니다.
이는 (호환 모드에서 실행하지 않고 레거시가 아닌 스크립트에 대해 그렇게 할 이유가 거의 없는 경우) getopt
매개변수가 옵션에 대해 비어 있거나 선택적 값으로 생성되고 추가됨을 의미합니다. 옵션 바로 뒤의 매개변수 목록에 추가됩니다.
즉, 옵션 뒤에는 항상 인수가 있으므로 항상 가 필요합니다 shift 2
.
그런데 선택적 매개변수의 경우 nl
while/case 루프 전에 기본값으로 설정하거나 기본값으로 매개변수 확장을 사용해야 합니다. 예를 들어
nl="${2:-default_value}"
동일한 Case 문에서 짧은 옵션과 긴 옵션도 테스트해야 합니다. 그렇지 않으면 길고 짧은 변형을 처리하기 위해 불필요하게 코드를 복제하게 됩니다. 예를 들어:
-l|--long) ... ;;