Viele Shellprogramme haben Optionen, die das Verhalten des Programmes anpassen. Aber wie wird sowas umgesetzt? Am einfachsten mit dem Bashbuiltin
getopts (nicht zu verwechseln mit dem Programm "getopt", das etwas Ähnliches macht).
Ein einfaches Beispiel: ein Skript mit vier Optionen.
#!/bin/bash
usage="Usage: ein Hilfetext..."
while getopts "abch" options; do
case $options in
a ) echo 'option -a gesetzt';;
b ) echo 'option -b gesetzt';;
c ) echo 'option -c gesetzt';;
h ) echo $usage
exit 0
;;
\? ) echo $usage
exit 1
;;
esac
done
Obiges Skript hat vier Optionen -a, -b, -c und -h für einen Hilfetext. Alle Optionen dürfen gleichzeitig gesetzt werden, auch mehrfach und zwar immer in beliebiger Reihenfolge. Keine der Optionen erfordert einen Parameter. Nur wenn eine unbekannte Option, etwa -x gesetzt wird, tritt ein Fehler auf, das Skript wird dann sofort beendet und ein kleiner Hilfetext ausgegeben.
Sollen sich die Optionen gegenseitig ausschließen, muss das extra geprüft werden. Z.B. mit einem Counter:
#!/bin/bash
usage="Usage: ein Hilfetext..."
counter="0"
while getopts "abch" options; do
case $options in
a ) var='option -a gesetzt'
((counter+=1))
;;
b ) var='option -b gesetzt'
((counter+=1))
;;
c ) var='option -c gesetzt'
((counter+=1))
;;
h ) echo $usage
exit 0
;;
\? ) echo $usage
exit 1
;;
esac
done
if [ $counter -eq 1 ];then
echo $var
exit 0
else
echo 'Ganz falsch! Zuviele oder zuwenig Optionen'
echo $usage
exit 1
fi
Zuerst wird die Variable "counter" auf Null gesetzt, für jede Option, die optargs findet, wird sie um 1 erhöht. Aber nur wenn "$counter" genau 1 ist, wird auch wirklich weiter gemacht, ansonsten bricht das Skript ab und gibt einen Hilfetext aus.
Optionen, die einen Parameter benötigen definiert man durch Anhängen eines Doppelpunktes:
#!/bin/bash
usage="Usage: ein Hilfetext..."
counter="0"
while getopts "af:h" options; do
case $options in
a ) var='option -a gesetzt'
((counter+=1))
;;
f ) if [ -f $OPTARG ] ;then
file=$OPTARG
((counter+=1))
fi
;;
h ) echo $usage
exit 0
;;
\? ) echo $usage
exit 1;;
esac
done
if [ $counter -ge 1 -a -n "$file" ];then
echo "var: $var, file: $file"
exit 0
else
echo 'Ganz falsch! Zuviele oder zuwenig Optionen'
echo $usage
exit 1
fi
"af:h"
Der Doppelpunkt hinter dem "f" kennzeichnet die Option als eine, die einen Parameter braucht. Wird die Option ohne Parameter verwendet, bricht das Skript mit einer passenden Fehlermeldung ab.
file=$OPTARG
In getopts Variable(n) OPTARG steckt der Parameter, der beim Aufruf des Skriptes der jeweiligen Option mitgegeben wurde.
if [ -f $OPTARG ]
Da der Parameter der Option "-f" eine Datei sein muss, prüfe ich als Erstes gleich deren Existenz.
if [ $counter -ge 1 -a -n "$file" ]
In diesem Fall ist nur "-f" Pflicht, "-a" ist optional.
Der Counter kann dann natürlich größer oder gleich 1 sein (-ge) UND (-a) die Variable "$file" darf nicht leer sein (-n). Nur dann wird das Skript weiter ausgeführt. Im obigen Fall ist das nur die Ausgabe der Optionen und Parameter.
Zu beachten: die eckigen Klammern "[" sind in Wirklichkeit ein Programm mit dem Namen "test". Mehr dazu mit "man [" oder "man test".
Links:
Sehr gelungen finde ich das Tutorial auf
bash-hackers.org/wiki/doku.php/howto/getopts_tutorial
Weitere Beispiele für getopts gibt es unter
linux.die.net/abs-guide/internal.html#GETOPTSX