cold28 schrieb:
| #!/bin/bash
args=`getopt abo: $*`
if [ $? != 0 ]
[...]
|
Kann mir jemand bitte bei dem obigen code helfen es zu verstehen???
Die 2. Zeile parst meine kommandozeile, wenn ich das richtig verstehe. Aber nach was? Und was bedeutet dieses "abo"?
Die Zweite Zeile weist der Variablen args
die Ausgabe des getop-Befehls als Wert zu.
Immer wenn du einen Befehl findest, bei dem du nicht weißt, was er tut, solltest du die Dokumentation lesen, also in dem Fall man 1 getopt. Dann kann man sich die zulässigen Argumente ansehen:
SYNOPSIS
getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters
Wir haben also einen Aufruf der ersten Form - und schon weißt du dass abo:
der optstring ist und $*
die Parameter. $*
liefert dir die dem Skript übergebenen Argumente als zusammenhängenden String (vgl. https://www.tldp.org/LDP/abs/html/internalvariables.html#APPREF, $@
würde sie als Array liefern).
Für eine Beschreibung des optstring
kannst du man 3 getopt lesen. abo:
beschreibt also drei optionale Schalter (-a
, -b
und -o [ARG]
), wobei o:
wegen dem nachfolgenden Doppelpunkt immer zwingend ein Argument benötigt.
Wozu steht "$?" ? Das letzte kommando der eingelesenen Zeile?
Der Rückgabewert des zuletzt ausgeführten Befehls: https://www.tldp.org/LDP/abs/html/exit-status.html#EXITSTATUSREF. Damit wird also geprüft, ob der getopt-Befehl sich mit einem Fehler beendet hat.
Wie muss ich dann die if-bedingungen verstehen?
Wenn der vorangegangene Befehl einen anderen Exit-Status als 0 zurückgegeben hat, gibt das Skript die Usage-Informationen aus und beendet sich selbst mit dem Exit-Status 2.
Was bewirkt set – $args ???
Dazu schaust du in man 1 set.
Das ist die Aufruf-Form
set −− [argument...]
Und dazu steht in der Manpage:
The special argument "−−" immediately following the set command name can be used to delimit the arguments if the first argument begins with '+' or '−', or to pre‐
vent inadvertent listing of all shell variables when there are no arguments. The command set −− without argument shall unset all positional parameters and set the
special parameter '#' to zero.
Der set-Befehl setzt also die Argumente des Skripts entsprechend der Ausgabe von getopt.
Das ganze dient also dazu die dem Skript übergebenen Argumente zu prüfen und abzubrechen, wenn da etwas dabei ist, das nicht dem gewünschten Schema entspricht.