Zum Beispiel, wenn ich ein Skript ./foo habe, das 10 Parameter akzeptiert, und ich nur den 8. Parameter übergeben möchte. Die einzige Möglichkeit, wie ich das derzeit weiß, ist:
./foo '' '' '' '' '' '' '' 'bar'
Gibt es einen einfacheren / besseren Weg?
shell-script
parameter
Kerry Randolph
quelle
quelle
Antworten:
Eine andere Möglichkeit, dies zu tun, besteht darin, den zu deklarierenden Parameter zu benennen und dies dann zu tun:
AUSGABE
Im obigen Beispiel wird die explizit deklarierte Umgebungsvariable dem Befehlszeilenargument vorgezogen, das Befehlszeilenargument wird jedoch verwendet, wenn die Umgebungsvariable entweder leer oder nicht gesetzt ist. Wenn sowohl die 8. Positions- als auch die Umgebungsvariable
$eight
leer oder nicht gesetzt sind, wird der Standardwert some_default zugewiesen$eight
. In beiden Fällen:
kann das aus den Anweisungen:-
oder entfernt werden:=
, wenn leer ein akzeptabler Wert sein sollte.Die Variable
$eight
hätte auch so eingestellt werden können:... und die vorherige Zeile wurde komplett weggelassen, aber ich wollte demonstrieren, dass das Deklarieren einer Variablen auf diese Weise zu einem dauerhaften Wert führt, und habe dies in zwei Befehlen getan. In beiden Fällen
$eight
wird der endgültige Wert dieser zusammengesetzten Parametererweiterung festgelegt.getopts
- für robuste Skripte - ist oft die beste Möglichkeit, mit Befehlsoptionen umzugehen . Andererseits sind Positionsparameter fast immer das einfachste Mittel, um Operanden in einem Skript robust zu behandeln .Beispielsweise:
AUSGABE
Dort sehen wir nur den achten Operanden, aber 101 davon sind aus meinem Testverzeichnis entfernt.
quelle
Angenommen, Sie können das Skript ändern, sollten Sie die Verwendung optionaler Parameter (Optionen) anstelle der erforderlichen Parameter (Argumente) in Betracht ziehen.
Wenn Sie jeden der ersten 7 sieben Parameter als Option haben und standardmäßig die leere Zeichenfolge verwenden, können Sie Folgendes tun:
Wenn Sie eine POSIX-kompatible Shell verwenden , können Sie das
getopts
Dienstprogramm oder das Programm verwendengetopt
.bash
- wie die meisten Muscheln -getopts
als eingebautes Angebot . In beiden Fällen ist es einfacher, einen eigenen Befehlszeilenparser zu erstellen.Sofern Sie nicht so etwas wie die letzten X-Nicht-Optionsargumente als Werte für die letzten Y-Argumente und XY-Optionsargumente implementieren, müssen Sie Optionszeichenfolgen vor jeder der 7 (jetzt leeren) Zeichenfolgen angeben, wenn Sie eine dieser Zeichenfolgen festlegen möchten. Dies ist jedoch keine übliche Praxis, normalerweise ist eine Option immer eine Option und ein Argument ein Argument, und die Reihenfolge der Option "Einfügen" ist frei.
quelle
+1
fürgetopt(s)
. Positionsparameter sind eine traurige Zeit und sollten vermieden werden.