3.8 getopts – Kommandozeilenoptionen auswerten
 
Bei fast allen Linux-UNIX-Kommandos finden Sie so genannte Optionen, die mit einem Minuszeichen (–) eingeleitet werden. Bspw. bei ls –l ist –l die Option. Um sich um solche Optionen zu kümmern, können Sie die Argumente der Kommandozeile entweder selbst überprüfen und auswerten oder Sie verwenden den Befehl getopts. Hier die Syntax zu getopts:
getopts Optionen Variable [Argumente]
Um die Funktion getopts richtig einzusetzen, müssen Sie folgende Regeln beachten:
|
Auch wenn getopts benutzt wird, so setzt dies nicht voraus, dass unbedingt Optionen angegeben werden müssen. |
|
Optionen müssen vor dem Dateinamen bzw. Parameter stehen: |
kommando -o datei.txt # Richtig
kommando datei.txt -o # Falsch
|
Die Reihenfolge, in der die Optionen angegeben werden, ist unwichtig: |
kommando -o -x datei.txt # Richtig
kommando -x -o datei.txt # Auch richtig
|
Optionen können auch zusammengefasst werden: |
kommando -ox datei.txt # Richtig
kommando -xo datei.txt # Richtig
Wird getopts aufgerufen, überprüft dieses Kommando, ob sich eine Option (eingeleitet mit einem »–«) in den Positionsparametern (von links nach rechts) befindet. Der Parameter, der als Nächstes bearbeitet werden soll, wird bei einer Shell in der automatischen Variable OPTIND verwaltet. Der Wert dieser Variablen beträgt beim Aufruf erst einmal 1 – wird aber bei jedem weiteren getopts-Aufruf um 1 erhöht. Wenn eine Kommandozeile mehrfach eingelesen werden soll, muss der Index manuell zurückgesetzt werden.
Wird eine Option gefunden, dann wird dieses Zeichen der Variablen »Variable« zugewiesen. In der Zeichenkette »Optionen« werden alle Schalter mit einem Kennbuchstaben angegeben. Schalter, die zusätzliche Argumente erhalten, bekommen einen Doppelpunkt dahinter angehängt. Die Optionen, die ein weiteres Argument erwarten (also die, die mit einem Doppelpunkt markiert sind), werden in der Shell-Variablen OPTARG gespeichert.
Wenn nicht ausdrücklich ein »Argument« beim Aufruf von getopts übergeben wird, verwendet das Shell-Kommando die Positionsparameter, also die Argumente von der Kommandozeile des Scripts.
Wenn getopts 0 zurückliefert, deutet dies auf eine gefundene Option hin. Bei einem Wert ungleich 0 wurde das Ende der Argumente erreicht oder es ist ein Fehler aufgetreten. Wollen Sie eine Fehlermeldungsausgabe vermeiden, können Sie einen Doppelpunkt als erstes Zeichen verwenden oder die Shell-Variable OPTERR auf 0 setzen.
Gewöhnlich wird getopts in einer Schleife mit einer case-Konstruktion ausgewertet. Zwar wurde beides bisher noch nicht behandelt (erst im nächsten Kapitel), aber trotzdem will ich es an dieser Stelle nicht bei der trockenen Theorie belassen. Hier ein mögliches Beispiel:
# Demonstriert getopt
# Name: agetopter
while getopts abc:D: opt
do
case $opt in
a) echo "Option a";;
b) echo "Option b";;
c) echo "Option c : ($OPTARG)";;
D) echo "Option D : ($OPTARG)";;
esac
done
Das Script bei der Ausführung:
you@host > ./agetopter -a
Option a
you@host > ./agetopter -b
Option b
you@host > ./agetopter -c
./agetopter: option requires an argument -- c
you@host > ./agetopter -c Hallo
Option c : (Hallo)
you@host > ./agetopter -D
./agetopter: option requires an argument -- D
you@host > ./agetopter -D Nochmals
Option D : (Nochmals)
you@host > ./agetopter -ab
Option a
Option b
you@host > ./agetopter -abD
Option a
Option b
./agetopter: option requires an argument -- D
you@host > ./agetopter -abD Hallo
Option a
Option b
Option D : (Hallo)
you@host > ./agetopter -x
./agetopter: illegal option – x
Im Beispiel konnten Sie außerdem auch gleich die Auswirkungen des Doppelpunktes hinter einem Optionszeichen erkennen. Geben Sie bei Verwendung einer solchen Option kein weiteres Argument an, wird eine Fehlermeldung zurückgegeben. Selbst ein falsches Argument wertet getopts hier aus und meldet den Fehler.
Wollen Sie die Fehlerausgabe selbst behandeln, also nicht eine von getopts produzierte Fehlermeldung verwenden, dann müssen Sie die Ausgabe von getopts in das Datengrab (/dev/null) schieben und als weitere Option in case ein Fragezeichen auswerten. Im Fehlerfall liefert Ihnen nämlich getopts ein Fragezeichen zurück. Dasselbe Script, jetzt ohne getopts-Fehlermeldungen:
# Demonstriert getopt
# Name: agetopter2
while getopts abc:D: opt 2>/dev/null
do
case $opt in
a) echo "Option a";;
b) echo "Option b";;
c) echo "Option c : ($OPTARG)";;
D) echo "Option D : ($OPTARG)";;
?) echo "($0): Ein Fehler bei der Optionsangabe"
esac
done
Das Script bei einer fehlerhaften Ausführung:
you@host > ./agetopter2 -D
(./agetopter2): Ein Fehler bei der Optionsangabe
you@host > ./agetopter2 -x
(./agetopter2): Ein Fehler bei der Optionsangabe
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|