Parsen von Argumenten und Parametern - getopts vs. getopt
12.
August
2017
Irgendwann einmal trifft es jeden, der in der IT-Abteilung mit UNIX-Betriebssystemen zu tun hat: Es müsste mal eben ein kleines Skript geschrieben werden. Das Skript wird dann doch komplexer und und es sollen Optionen und Parameter übergeben werden. Zum Parsen der Kommandozeilen-Optionen empfehlen sich zwei Hilfsmittel: getopt und getopts. Der Buchstabe s macht den Unterschied.
In der Befehlszeile einer Unix-Shell ist jede Zeichenkette ein Argument. So hat der Befehl “gzip –list datei” drei Argumente. Als Option bezeichnet man wiederum ein Argument, das das Verhalten des Programms ändert. Ein Parameter wiederum stellt eine Zusatzinformation entweder der Option oder dem Programm zur Verfügung.
Zum Einleiten einer Option hat sich das Bindestrich-Minus eingebürgert, gefolgt von einem oder mehreren Buchstaben: “ls -l” oder “java -version”. Alternativ werden auch eine kurze und lange Variante der gleichen Option angeboten (GNU): “gzip -l datei” und “gzip –list datei”. Die kurze Variante der Option hat darüberhinaus den Vorteil, daß sich mehrere zusammenschreiben lassen. Statt “gzip -l -v datei” kann man auch “gzip -lv datei” schreiben. Das klappt mit der langen Variante natürlich nicht.
Damit sind diese drei Varianten von Kommandozeilen-Optionen möglich:
Option ohne Parameter
Wie zum Beispiel in “ls -l”. Es ist ein einfaches Flag und bedeutet einfach “long format”
Option mit mandatorischem Parameter
Wie hier: “find / -type d”. Hier werden ab dem Wurzelverzeichnis alle Directories ausgegeben.
Mit “find / -type f” hingegen alle einfachen Dateien.
Option mit optionalem Parameter
“grep –context=1 Liste” gibt jeweils die Zeile über und unter der Trefferzeile aus. Bei “grep –context Liste” sind es jeweils zwei Zeilen darüber und darunter, da dies der Default-Wert ist
Und natürlich sind auch Parameter ohne Option denkbar. Wie bei “ls verzeichnisname”
Vor- und Nachteile von getopt und getopts
Während getopts als inline-Befehl der ksh und bash immer dabei ist, ist das neuere getopt-Tool möglicherweise nicht installiert. Wenn bei der Eingabe von “getopt -T” keine 4 zurückgegeben wird, dann ist auch noch eine ältere Version installiert (wie z.B. bei MacOS).
Pro und cons von getopts:
Shell builtin-Befehl, in jeder POSIX-Shell dabei
unterstützt keine lange Schreibweise, wie bei den GNU-Tools
keine optionalen Parameter (,die aber ohnehin nie benötigt werden)
Pros und cons von getopt:
kein Shell-Builtin
Ältere Versionen unterstützen möglicherweise keine Whitespaces in Parametern (“script.sh -x ‘ abc 34’ -y ‘ ‘”)
unterstützt lange Optionen (gzip –list file)
optionale Parameter möglich
Habt ihr allgemein verwendbare Skripte, die auf andere Unix-Betriebssysteme portiert werden könnten, würde ich zur getopts-Variante raten. Insbesondere, wenn es ausreichend ist, die kurze Optionsschreibweise zu verwenden. Sind eure Skripte plattform-abhängig würde ich getopt (in Version 4) empfehlen.
Beispiel für getopt
Genug geschrieben. Wer direkt loslegen mag findet hier das Skript test_getopt.sh.
Und so schaut das ganze beim Testen aus:
… und für getopts
Und alle, die “getopts” den Vorzug geben finden das Beispielprogramm test_getopts.sh hier.