Wie kann ich verbleibende Argumente erhalten, nachdem ich mit getopts analysierte Elemente herausgezogen habe?

14

Ich möchte einige Argumente mit getopts in ein Bash-Skript einbauen, möchte aber auf die verbleibenden Argumente zugreifen können, die nicht in der Optionsliste enthalten sind. Wenn ich zum Beispiel einen Anruf habe:

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

Ich hätte:

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

Was ist der einfachste Weg, um "andere Argumente hier" zu erhalten, die von getopts nicht verarbeitet werden sollten?

Tim
quelle

Antworten:

17

Sie müssen verschieben, wenn Sie ein Argument analysieren oder setzen

Verschieben Sie $ ((OPTIND -1)), nachdem Sie das Parsen beendet haben, und verfahren Sie dann wie gewohnt, z

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

while test $# -gt 0; do
  echo $1
  shift
done
Pogma
quelle
1
Es lohnt sich zu erklären, dass $ OPTIND der Index der nächsten zu berücksichtigenden Option ist, nachdem jedes Getopts ausgeführt wurde. Daher enthält $ * 3 Parameter, nach dem ersten gültigen Aufruf sind es 2 und nach dem zweiten sind es 3. Sollte ein Aufruf ungültig sein, wird er mit dem früheren Wert abgebrochen. Also, wenn Parameter 1 nicht gültig ist, wird OPTIND 1 sein (daher wird das obige Beispiel shift $(expr 1 - 1)sicher sein.
sibaz 30.10.17
0

Am Ende des Parsens enthält die Variable $ @ nach dem Verschieben das Zeilenende:

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