O comportamento é que ele para de analisar a linha de comando e deixa o restante dos argumentos como está. O --
em si é removido (ou melhor, $OPTIND
indicará que foi processado, mas $opt
no código abaixo nunca será -
e, se você usar shift "$(( OPTIND - 1 ))"
como normalmente, você nunca verá isso.
Exemplo:
#!/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' "$@"
Executando:
$ bash script.sh -a hello -- -b world
Got a: "hello"
Other argument: "-b"
Other argument: "world"
Como você pode ver, o -b world
da linha de comando não foi processado por getopts
.
Ele interrompe a análise da linha de comando em --
ou no primeiro argumento não opcional:
$ 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"
Nesse caso, --
não foi "removido", pois getopts
nunca chegou tão longe.