So erstellen Sie ein bash-script mit einem optionalen Parameter für eine fahne
Ich versuche ein script zu erstellen, welches eine Flagge mit optionalen Optionen. Mit getopts ist es möglich, an einem zwingenden argument (mit einem Doppelpunkt) nach der Flagge, aber ich möchte zu halten, ist es optional.
Es wird so etwas wie dieses:
./install.sh -a 3
oder
./install.sh -a3
wo ist 'a' die Flagge und '3' ist der optionale parameter folgt ein.
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
getopt
externes Programm ermöglicht, Optionen zu haben, ein einzelnes optionales argument, indem Sie eine Doppel-Doppelpunkt der name der option../install.sh -a 3
gibt "- option, kein argment" aber das argument "3"getopt
scheint nicht zu erlauben, ein Leerzeichen zwischen einer option und Ihrem argument optional.man getopt
: "Wenn die option ein optionales argument, es muss geschrieben werden, direkt nach der option-Zeichen, falls vorhanden."Folgende ist ohne
getopt
und es nimmt ein optionales argument mit der -a-Option:Andere Optionen/flags auch problemlos Hinzugefügt werden können.
case
war nicht erforderlich. bearbeitet dass. danke @l0b0in "$@"
ist nicht erforderlich.for WORD; do
wird die Schleife über die Argumente.Verwenden Sie die Funktion getopt. Auf den meisten Systemen
man getopt
Ausbeute Dokumentation für Sie, und sogar Beispiele von der Verwendung in einem Skript. Auf der man-Seite auf meinem system:Folgende code-fragment zeigt, wie man verarbeiten könnte der Argumente
für einen Befehl, können die Optionen -a und -b, und die option-o,
das erfordert ein argument.
Dieser code wird akzeptiert einen der folgenden äquivalent:
getopt
ist die richtige Antwort, aber Ihre lange Beispiel nicht zeigen, wie zu implementieren ist eine option, deren argument ist ebenfalls optional.In der bash gibt es einige implizite variable:
Beispiel:
break
.break
beim Versuch, vereinfachen das Beispiel, dass Schiffe mitgetopt
.#!/bin/bash
😉Meine Lösung:
in $@
ist überflüssig. Auch, POSIXsh
nicht über arrays.==
ist nicht tragbar.in $@
überflüssig? Es könnte sein, substituded von$list
aber erforderlich ist. Ich Stimme der code ist nicht portabel, und ich änderte den header zu#!/bin/bash
for arg
iteriert über"$@"
standardmäßig.