메시지를 내보내는 getopts `--`(이중 대시) 감지

메시지를 내보내는 getopts `--`(이중 대시) 감지

getopts저는 이라는 변수를 사용하는 관용적인 방법을 사용하고 있습니다 arg. 아래와 같이 옵션 이름을 캡처할 수 있습니다. 메시지를 내보낼 수 있도록 getopts가 "--"에 도달하는 순간을 감지할 수 있습니까?

while getopts "$shortopts" arg; do
   echo "--> arg: $arg"
   case $arg in
   ("V")
     printf '%s\n' "Version" 
     return
     ;;
   ("u")
     printf '%s\n' "Usage" 
     return
     ;;
   ("h")
     printf '%s\n' "Help" 
     return
     ;;
   esac
done

답변1

메시지를 내보낼 수 있도록 getopts가 "--"에 도달하는 순간을 감지할 수 있습니까?

이렇게 할 필요는 없습니다.

getopts표준 옵션 처리를 구현합니다. 즉, 옵션이 아닌 인수가 보이거나 인수가 보이면 --옵션 목록을 명시적으로 종료하는 options 검색을 중지합니다. (첫 번째 점은 전체 명령줄에서 옵션을 찾는 GNU Custom과 다릅니다.)

프로그램은 Meet 에 신경 쓸 필요가 없습니다 --.

즉, getopts위치 매개변수 목록이 폐기되지 않으므로 그 안의 마지막 매개변수가 인지 알 수 있다 --.

#!/bin/bash
while getopts a:bc opt; do
    echo "option $opt arg $OPTARG"
done
last=
if [ "$OPTIND" -ge 2 ]; then
        shift "$((OPTIND - 2))"
        last=$1
        shift 1
else
        shift "$((OPTIND - 1))"
fi
if [ "$last" = "--" ]; then
        echo "options were terminated by a double-dash (or last arg was an option-argument '--')"
fi
echo "remaining args: $*"

예를 들어

$ bash opts.sh -a blah -- -b foo
option a arg blah
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: -b foo

그러나 마지막 인수만 확인하므로 옵션에 대한 --구분 기호 또는 옵션 인수가 될 수 있습니다. --예를 들어, 이것은 거짓양성입니다 --. 여기에는 구분 기호가 없습니다.

$ bash opts.sh -a -- foo
option a arg --
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: foo

물론 자신만의 옵션 처리를 구현할 수도 있지만 그렇게 하면 셸이 하위 문자열 처리를 어렵게 만들기 때문에 약간 짜증납니다. ( options 인수를 사용하는지 여부 -abc에 따라 이를 세 가지 다른 옵션 또는 하나 또는 두 개로 인식해야 합니다 .)-a-b

어쨌든 일반적으로 필요한 것보다 훨씬 더 복잡한 작업을 수행하지 않는 한 고려할 이유가 없습니다 . 더 복잡한 작업을 수행하더라도 외부에서 수행하는 것을 고려할 수 있습니다(다른 구분 --기호 사용). getoptsin 표현식이 주어지거나 GNU Parallel이 분리된 인수 목록을 가져오는 방법 등이 있습니다.find:::::::

답변2

루프가 끝나면 다음을 getopts수행하는 데 익숙해집니다.

shift "$((OPTIND - 1))"

나머지 매개변수는 나머지 매개변수가 됩니다. ( man getopts1POSIX의 예제 1 섹션을 참조하세요).

요점은,설명에서:

다음 상황 중 하나는 옵션의 끝을 식별해야 합니다. 첫 번째 "--" 인수가 옵션 인수가 아니거나, 옵션 인수가 아니고 "-"로 시작하지 않는 인수가 발견되었거나, 오류가 발생했습니다. .


패턴이 있다고 가정합니다 ab:. 다음은 4. 데모입니다 --.

  1. -a x y z
    • -a배너. 나머지:x y z
  2. -a -b foo x y z
    • -a플래그 + -b값 = foo.rest:x y z
  3. -b foo -a -b bar x y z
    • -a플래그 + -b값 = foosum.rest bar:x y z
    • 두 값이 모두 -b전달됩니다. 스크립트가 처리하는 방법에 따라 다릅니다.
  4. -a -b foo -- -a -b x y z
    • -a플래그 + -b값 = foo.rest:-a -b x y z
  5. -a -b foo -x y z
    • 잘못되었거나 알 수 없는 옵션-x
  6. -b foo bar -x y z
    • -b값 = foo.rest:bar -x y z
  7. -b -- -a bar -x y z
    • -a플래그 + -b값 = --.rest:bar -x y z

7의 경우 옵션에 대한 인수로 , --또는 를 포함한 모든 문자열을 가질 수 있습니다 "".


$((...))1 그러나 예제에서 ; 주위의 따옴표가 어떻게 누락되었는지 확인하세요. POSIX 예제에서는 기본값이 포함되어 있다고 가정하는데 $IFS, 이는 어떤 상황에서도 사용할 수 없기 때문에 불행한 일입니다.

답변3

getopts루프 조건을 0으로 초기화되는 변수(이 경우 1)로 설정합니다 "--"). 예를 들어

stop=0
...
while [[ 0 -eq $stop ]] ; do
# getopts call ...
...
"--") stop=1;;r
esac
done

관련 정보