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 OPTINDist Großbuchstaben) wird normalerweise unmittelbar nach einer getopts whileSchleife gefunden. $OPTINDist die Anzahl der von gefundenen Optionen getopts.
Genau genommen OPTINDgibt pauljohn32 in den Kommentaren die Position des nächsten Befehlszeilenarguments an.
Aus dem GNU Bash Referenzhandbuch :
getopts optstring name [Argumente]
getoptswird von Shell-Skripten zum Analysieren von Positionsparametern verwendet.optstringenthä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 wirdgetoptsdie nächste Option in den Namen der Shell-Variablen eingefügt, initialisiert,namefalls nicht vorhanden, und der Index des nächsten zu verarbeitenden Arguments in die VariableOPTIND.OPTINDwird 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ückgesetztOPTINDautomatisch; Es muss manuell zwischen mehreren Aufrufengetoptsinnerhalb desselben Shell-Aufrufs zurückgesetzt werden, wenn ein neuer Parametersatz verwendet werden soll.Wenn das Ende der Optionen erreicht ist, wird
getoptsmit einem Rückgabewert größer als Null beendet.OPTINDwird auf den Index des ersten Nicht-Options-Arguments gesetzt, und der Name wird auf '?'
getoptsAnalysiert normalerweise die Positionsparameter. Wenn jedoch mehr Argumente angegeben werdenargs, werdengetoptsdiese stattdessen analysiert.
shift n
entfernt n Zeichenfolgen aus der Liste der Positionsparameter. So shift $((OPTIND-1))entfernt alle Optionen , die von analysiert wurden getoptsaus der Parameterliste, und so nach diesem Punkt, $1auf 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 bashund dash).
$((...))berechnet nur Sachen. In Ihrem Fall nimmt es den Wert von $optintund subtrahiert 1.
shiftEntfernt Positionsparameter. In Ihrem Fall werden optint-1Parameter entfernt .
Für weitere Informationen einen Blick auf help getopts, help shift, Blick auf man bashfür „Arithmetic Expansion“, und vor allem Google für getopts.