Ich bin kein Linux-Typ, sondern stecke in einem Skript, das ich für mein Projekt lesen muss. Kann mir jemand helfen, was dieser Befehl tut?
shift $(($optind - 1))
Ich bin kein Linux-Typ, sondern stecke in einem Skript, das ich für mein Projekt lesen muss. Kann mir jemand helfen, was dieser Befehl tut?
shift $(($optind - 1))
Antworten:
shift $((OPTIND-1))
(Anmerkung OPTIND
ist Großbuchstaben) wird normalerweise unmittelbar nach einer getopts
while
Schleife gefunden. $OPTIND
ist die Anzahl der von gefundenen Optionen getopts
.
Genau genommen OPTIND
gibt pauljohn32 in den Kommentaren die Position des nächsten Befehlszeilenarguments an.
Aus dem GNU Bash Referenzhandbuch :
getopts optstring name [Argumente]
getopts
wird von Shell-Skripten zum Analysieren von Positionsparametern verwendet.optstring
enthält die zu erkennenden Optionszeichen; Wenn auf ein Zeichen ein Doppelpunkt folgt, wird erwartet, dass die Option ein Argument enthält, das durch Leerzeichen von diesem getrennt sein muss. Der Doppelpunkt (':') und das Fragezeichen ('?') Dürfen nicht als Optionszeichen verwendet werden. Bei jedem Aufruf wirdgetopts
die nächste Option in den Namen der Shell-Variablen eingefügt, initialisiert,name
falls nicht vorhanden, und der Index des nächsten zu verarbeitenden Arguments in die VariableOPTIND
.OPTIND
wird jedes Mal auf 1 initialisiert, wenn die Shell oder ein Shell-Skript aufgerufen wird. Wenn eine Option ein Argument erfordert, fügt getopts dieses Argument in die Variable einOPTARG
. Die Shell wird nicht zurückgesetztOPTIND
automatisch; Es muss manuell zwischen mehreren Aufrufengetopts
innerhalb desselben Shell-Aufrufs zurückgesetzt werden, wenn ein neuer Parametersatz verwendet werden soll.Wenn das Ende der Optionen erreicht ist, wird
getopts
mit einem Rückgabewert größer als Null beendet.OPTIND
wird auf den Index des ersten Nicht-Options-Arguments gesetzt, und der Name wird auf '?'
getopts
Analysiert normalerweise die Positionsparameter. Wenn jedoch mehr Argumente angegeben werdenargs
, werdengetopts
diese stattdessen analysiert.
shift
n
entfernt n Zeichenfolgen aus der Liste der Positionsparameter. So shift $((OPTIND-1))
entfernt alle Optionen , die von analysiert wurden getopts
aus der Parameterliste, und so nach diesem Punkt, $1
auf den ersten Nicht-Option Argument wird sich auf das Skript übergeben.
Aktualisieren
Wie mikeserv in dem Kommentar erwähnt, shift $((OPTIND-1))
kann es unsicher sein. Um unerwünschte Worttrennungen usw. zu vermeiden, sollten alle Parametererweiterungen in doppelte Anführungszeichen gesetzt werden. Die sichere Form für den Befehl ist also
shift "$((OPTIND-1))"
find
) so aussehen, als würden sie Optionen nach Nicht-Optionen zulassen, aber sie haben keine Operanden, die mit einem Bindestrich beginnen.
IFS
, aber es ist besser, auf Nummer sicher zu gehen, als es zu tun. ;)
IFS=0123456789
, shift $((OPTIND-1))
(ohne Anführungszeichen) verwandelt sich in shift ""
das wird unbemerkt ignoriert (in ksh
) oder erzeugt einen Fehler (in bash
und dash
).
$((...))
berechnet nur Sachen. In Ihrem Fall nimmt es den Wert von $optint
und subtrahiert 1.
shift
Entfernt Positionsparameter. In Ihrem Fall werden optint-1
Parameter entfernt .
Für weitere Informationen einen Blick auf help getopts
, help shift
, Blick auf man bash
für „Arithmetic Expansion“, und vor allem Google für getopts
.