"--"를 만났을 때 "getopts"의 동작은 무엇입니까?

"--"를 만났을 때 "getopts"의 동작은 무엇입니까?

관례적으로 --이는 그 이후에는 더 이상의 옵션이 없음을 의미합니다. getoptswith case절 을 사용할 때 -)패턴 절이 일치하지 않는 것 같습니다 --. 그렇다면 getopts만날 때의 행동은 무엇입니까 --? --옵션으로 취급합니까, 옵션이 아닌 매개변수로 취급합니까, 아니면 둘 다로 취급하지 않습니까 ? 감사해요.

답변1

동작은 명령줄 구문 분석을 중지하고 나머지 매개변수를 변경하지 않고 그대로 두는 것입니다. 자체적으로 제거 됩니다 --(또는 오히려 $OPTIND처리되었음을 표시하지만 $opt아래 코드에서는 처리되지 않으며 정상적으로 -수행하면 shift "$(( OPTIND - 1 ))"결코 볼 수 없습니다).

예:

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        *)  echo 'error' >&2
            exit 1
    esac
done

shift "$(( OPTIND - 1 ))"

printf 'Other argument: "%s"\n' "$@"

실행하세요:

$ bash script.sh -a hello -- -b world
Got a: "hello"
Other argument: "-b"
Other argument: "world"

보시다시피 -b world명령줄 비트는 처리되지 않습니다 getopts.

--옵션이 아닌 첫 번째 인수 또는 첫 번째 인수에서 명령줄 구문 분석을 중지합니다.

$ bash script.sh something -a hello -- -b world
Other argument: "something"
Other argument: "-a"
Other argument: "hello"
Other argument: "--"
Other argument: "-b"
Other argument: "world"

--이 경우 에는아니요그렇게까지 도달한 적이 없기 때문에 "삭제"합니다 getopts.

관련 정보