Unter Unix-ähnlichen Betriebssystemen ist getopts ein integrierter Befehl der Bash-Shell. Es analysiert Befehlsoptionen und Argumente, wie sie beispielsweise an ein Shell-Skript übergeben werden.
Beschreibung
getopts ist die Bash-Version eines anderen Systemtools, getopt. Beachten Sie, dass der Befehl bash am Ende ein s enthält, um ihn vom Systembefehl zu unterscheiden.
Während das getopt-Systemtool von System zu System variieren kann, wird bash getopts durch den POSIX-Standard definiert. Wenn Sie also ein Skript mit getopts schreiben, können Sie sicher sein, dass es auf jedem System ausgeführt wird, auf dem bash im POSIX-Modus ausgeführt wird (z. B. set -o posix).
getopts analysiert kurze Optionen, die aus einem einzelnen Bindestrich ("-") und einem Buchstaben oder einer Ziffer bestehen. Beispiele für kurze Optionen sind -2, -d und -D. Es kann auch kurze Optionen in Kombination analysieren, z. B. -2dD.
Getopts kann jedoch keine Optionen mit langen Namen analysieren. Wenn Sie Optionen wie --verbose oder --help möchten, verwenden Sie stattdessen getopt.
Syntax
getopts optstring optname [arg]
Wie es funktioniert
getopts verarbeitet die Positionsparameter des übergeordneten Befehls. In bash wird dies in der Shell-Variablen "[email protected]" gespeichert. Wenn Sie diesen Befehl ausführen:
mycmd -a argument1 -b argument2
Während der Ausführung von mycmd enthält die Variable [email protected] die Zeichenfolge "-a argument1 -b argument2". Sie können getopts verwenden, um diese Zeichenfolge nach Optionen und Argumenten zu analysieren.
Jedes Mal, wenn Sie getopts ausführen, wird nach einer der in optstring definierten Optionen gesucht. Wenn es einen findet, platziert es den Optionsbuchstaben in einer Variablen namens optname. Wenn die Option nicht mit den in optstring definierten übereinstimmt, setzt getopts die Variable optname auf ein Fragezeichen ("?").
Wenn die Option ein Argument erwartet, erhält getopts dieses Argument und platziert es in $ OPTARG. Wenn ein erwartetes Argument nicht gefunden wird, wird die Variable optname auf einen Doppelpunkt (":") gesetzt. Getopts erhöht dann den Positionsindex $ OPTIND, der die nächste zu verarbeitende Option angibt.
Die spezielle Option mit zwei Bindestrichen ("-") wird von getopts als Ende der Optionen interpretiert.
getopts kann in Ihrem Skript mehrmals ausgeführt werden, beispielsweise in einer Schleife. Es verarbeitet eine Option pro Schleifeniteration. Wenn keine weiteren Optionen verarbeitet werden müssen, gibt getopts false zurück, wodurch eine while-Schleife automatisch beendet wird. Aus diesem Grund werden getopts und while häufig zusammen verwendet.
Angeben der Optstring
optstring ist eine Zeichenfolge, die definiert, nach welchen Optionen und Argumenten getopts sucht. Zum Beispiel in diesem Aufruf an getopts:
getopts "apZ" optname
Die von getopts erwarteten Optionen sind -a, -p und -Z ohne Argumente. Diese Optionen können in beliebiger Reihenfolge als -aZ, -pa, -Zap usw. kombiniert werden.
Angenommen, Sie möchten, dass die Optionen -a und -Z Argumente annehmen. Sie können dies angeben, indem Sie nach dieser Option einen Doppelpunkt (":") in optstring einfügen. Zum Beispiel:
getopts "a: pZ:" optname
Jetzt können Sie Argumente für die Optionen -a und -Z angeben, z. B. -a argument1 -pZ argument2. Die Option -p kann keine Argumente annehmen, da in optstring nach dem p kein Doppelpunkt steht.
Ausführliche Fehlerprüfung
Standardmäßig meldet getopts einen ausführlichen Fehler, wenn eine unbekannte Option oder ein falsch platziertes Argument gefunden wird. Außerdem wird der Wert von optname auf ein Fragezeichen ("?") Gesetzt. $ OPTARG wird kein Wert zugewiesen.
Wenn die Option gültig ist, aber ein erwartetes Argument nicht gefunden wird, wird optname auf "?" Gesetzt, $ OPTARG wird deaktiviert und eine ausführliche Fehlermeldung wird gedruckt.
Stille Fehlerprüfung
Wenn Sie jedoch am Anfang des Optstrings einen Doppelpunkt einfügen, wird getopts im Modus "Stille Fehlerprüfung" ausgeführt. Es werden keine ausführlichen Fehler zu Optionen oder Argumenten gemeldet, und Sie müssen eine Fehlerprüfung in Ihrem Skript durchführen.
Wenn im stillen Modus eine Option unerwartet ist, setzt getopts optname auf "?" und $ OPTARG auf das unbekannte Optionszeichen.
Wenn die Option in Ordnung ist, aber ein erwartetes Argument nicht gefunden wird, wird optname auf einen Doppelpunkt (":") und $ OPTARG auf das unbekannte Optionszeichen gesetzt.
Benutzerdefinierte Argumente angeben
Normalerweise möchten Sie, dass getopts die Argumente in [email protected] verarbeitet. In einigen Fällen möchten Sie jedoch möglicherweise manuell Argumente für getopts zum Parsen bereitstellen. In diesem Fall können Sie diese Argumente als letztes Argument des Befehls getopts angeben.
Beispiele
Hier ist ein Bash-Skript mit getopts. Das Skript druckt eine Begrüßung mit einem optionalen Namen und einer variablen Anzahl von Malen. Es gibt zwei mögliche Optionen: -n NAME und -t TIMES.
#! / bin / bash NAME = "" # Name der zu begrüßenden Person. TIMES = 1 # Anzahl der zu übergebenden Grüße. usage () {# Funktion: Gibt eine Hilfemeldung aus. echo "Verwendung: $ 0 [-n NAME] [-t TIMES]" 1> & 2} exit_abnormal () {# Funktion: Beenden mit Fehler. Verwendungs-Exit 1}, während getopts ": n: t:" options; do # Loop: Holen Sie sich die nächste Option; # stille Fehlerprüfung verwenden; # Optionen n und t nehmen Argumente an. case "$ {options}" in # n) # Wenn die Option n ist, ist NAME = $ {OPTARG} # setze $ NAME auf den angegebenen Wert. ;; t) # Wenn die Option t ist, ist TIMES = $ {OPTARG} # Setzen Sie $ TIMES auf den angegebenen Wert. re_isanum = '^ [0-9] + $' # Regex: Nur wenn! [[$ TIMES = ~ $ re_isanum]]; dann # wenn $ TIMES keine ganze Zahl ist: echo "Fehler: TIMES muss eine positive ganze Zahl sein." exit_abnormal exit 1 elif [$ TIMES -eq "0"]; dann # Wenn es Null ist: echo "Fehler: TIMES muss größer als Null sein." exit_abnormal # Beendet abnormal. fi ;; :) # Wenn das erwartete Argument weggelassen wurde: echo "Fehler: - $ {OPTARG} erfordert ein Argument." exit_abnormal # Beendet abnormal. ;; *) # Falls unbekannt (jede andere) Option: exit_abnormal # Beendet abnormal. ;; esac erledigt wenn ["$ NAME" = ""]; dann # Wenn $ NAME eine leere Zeichenfolge ist, ist STRING = "Hi!" # Unser Gruß ist nur "Hi!" else # Andernfalls STRING = "Hi, $ NAME!" # es ist "Hallo, (Name)!" fi COUNT = 1 # Ein Zähler. während [$ COUNT -le $ TIMES]; do # Während der Zähler kleiner als # oder gleich $ TIMES ist, geben Sie $ STRING # eine Begrüßung aus, lassen Sie COUNT + = 1 # und erhöhen Sie dann den Zähler. erledigt exit 0 # Normal beenden.
Wenn dieses Skript als Begrüßung bezeichnet wird, sieht die Ausgabe mit verschiedenen Optionen folgendermaßen aus:
./Gruß
Hi!
./gruß -n Dave
Hallo Dave!
./gruß -t 3
Hallo! Hallo! Hallo!
./gruß -t 4 -n Betty
Hallo Betty! Hallo Betty! Hallo Betty! Hallo Betty!
./gruß -n
Fehler: -n erfordert ein Argument. Verwendung: ./greeting [-n NAME] [-t TIMES]
./gruß -t
Fehler: -t erfordert ein Argument. Verwendung: ./greeting [-n NAME] [-t TIMES]
./gruß -t -1
Fehler: TIMES muss eine positive ganze Zahl sein. Verwendung: ./greeting [-n NAME] [-t TIMES]
./gruß -t 0
Fehler: TIMES muss größer als Null sein. Verwendung: ./greeting [-n NAME] [-t TIMES]
Verwandte Befehle
while - Führen Sie eine Reihe von Aktionen aus, während eine bestimmte Bedingung erfüllt ist.