Donnerstag, 21. November 2013

GNU getopt in Shellskripten

Auch in Shell Skripten möchte man hin- und wieder Optionen einsetzen. Hierzu bieten sich das GNU getopt Programm an, das neben kurzen Argumenten auch lange Argumente erlaubt. Auch optionale Parameter werden unterstützt.

Der Aufruf von getopt sortiert die Parameter nach ihrer Beschreibung um, so dass die zugewiesenen Parameter am Anfang stehen. Nach diesen folgt ein --, das von den nicht-zugewiesenen Parametern gefolgt wird.

Ein Beispiel: Wir erwarten einen Parameter a. Der dazugehörige Aufruf von getopt lautet:
getopt --options a -- "$@"
Wenn wir diesen Aufruf mit den Parametern "x -a y" aufrufen, dann liefert getopt den String "-a -- x y" zurück.
Falls wir ein notwendiges Argument mittels des Kennzeichners ":" markiert haben, wird dieser an die Option angehängt. Ein optionales Argument (markiert mit "::") führt, je nachdem ob es angegeben wurde oder nicht, zu einem Leerstring oder dem Argument. Auch hier wieder die Beispiele:
getopt --option a: -- "$@"
führt beim Aufruf mit "x -a y" zu dem String "-a y -- x". Wird das notwendige Argument weggelassen, bricht der getopt Aufruf mit einem Fehler ab.
Die optionale Variante:
getopt --option a:: -- "$@"
beim Aufruf mit "x -a y" zum Ausgabestring " -a '' -- 'x' 'y'" führt. Wenn hier das Argument y Teil von -a sein soll, muss der Aufruf "x -ay" lauten.

Doch wie wertet man das Ergebnis aus? Hier kann man am einfachsten die Aufrufargumente mittels
eval set -- "$TEMP"
neu setzen. Danach kann man in einer Schleife die Argumente prüfen und per shift entfernen, bis man zum "--" Argument kommt. Somit bleiben die restlichen Argumente übrig.
while true ; do
  case "$1" in
    -a|--along) do-something; shift ;;
    --) shift; break;;
    *) Error
  esac
done
Ein Beispiel findet man häufig auch unter: /usr/share/doc/util-linux/examples/getopt-parse.bash