Jak mogę uzyskać pozostałe argumenty po wyciągnięciu przeanalizowanych elementów za pomocą getopts?

14

Chcę przeanalizować niektóre argumenty do skryptu bash przy użyciu getopts, ale chcę mieć dostęp do pozostałych argumentów, które nie są uwzględnione na liście opcji. Na przykład, jeśli mam połączenie:

% script -a -b param -c param -d other arguments here

Miałbym:

while getopts "ab:c:d" opt ; do
.
done

Jaki jest najprostszy sposób na uzyskanie „innych argumentów tutaj”, które getopts nie powinien przetwarzać?

Tim
źródło

Odpowiedzi:

17

musisz zmienić, kiedy parsujesz argument lub wstawisz

przesuń $ ((OPINIA -1)) po zakończeniu parsowania, a następnie postępuj w zwykły sposób, np

while getopts "ab:c:d" opt ; do
.
done
shift $(expr $OPTIND - 1 )

while test $# -gt 0; do
  echo $1
  shift
done
pogma
źródło
1
Warto wyjaśnić, że $ OPTIND jest indeksem następnej opcji, którą należy wziąć pod uwagę, po każdym uruchomieniu getopts. Zatem $ * zawiera 3 parametry, po pierwszym prawidłowym wywołaniu jest to 2, a drugi to 3. Jeśli połączenie będzie nieprawidłowe, zostanie odrzucone z wcześniejszą wartością. Więc jeśli parametr 1 nie jest poprawny, OPTIND będzie 1 (stąd powyżej przykładzie shift $(expr 1 - 1), który jest bezpieczny.
sibaz
0

Na końcu analizy, po przesunięciu, zmienna $ @ zawiera koniec linii:

while getopts "ab:c:d" opt ; do
.
done
shift $((OPTIND-1))
OTHERARGS=$@
Bruno Mairlot
źródło