Optionen und Flags in Bash-Skripten mit `getopts` verarbeiten
February 22, 2015
Das Verarbeiten von Kommandozeilen-Optionen (auch "Flags" genannt) ist eine grundlegende Anforderung für die Erstellung benutzerfreundlicher und flexibler Shell-Skripte. Das Bash-Builtin getopts ist der Standardmechanismus, um einfache, POSIX-konforme Optionen zu parsen.
Diese Anleitung zeigt, wie getopts verwendet wird, um Optionen mit und ohne Argumente sowie eine Hilfe-Funktion zu implementieren.
Beispiel-Skript
Das folgende Skript demonstriert ein gängiges Muster. Es erwartet eine obligatorische Option -f mit einem Dateinamen und eine optionale -v-Option für ausführlichen Output.
#!/usr/bin/env bash
# Stellt sicher, dass das Skript bei Fehlern abbricht
set -e
# Standardwerte für Variablen
VERBOSE=0
FILE=""
# Funktion zur Anzeige der Hilfe
usage() {
echo "Usage: $0 -f <file_path> [-v]"
echo " -f <file_path> Pfad zur zu verarbeitenden Datei (obligatorisch)."
echo " -v Aktiviert den ausführlichen Modus (optional)."
echo " -h Zeigt diese Hilfe an."
}
# Verarbeitung der Optionen mit getopts
while getopts ":f:vh" opt; do
case "$opt" in
f)
FILE="$OPTARG"
;;
v)
VERBOSE=1
;;
h)
usage
exit 0
;;
:)
echo "Fehler: Die Option -$OPTARG erfordert ein Argument." >&2
usage
exit 1
;;
\?)
echo "Fehler: Unbekannte Option -$OPTARG" >&2
usage
exit 1
;;
esac
done
# Entfernt die verarbeiteten Optionen aus den Positions-Parametern
shift $((OPTIND - 1))
# Überprüfung, ob die obligatorische Option -f gesetzt wurde
if [ -z "${FILE}" ]; then
echo "Fehler: Die Option -f ist obligatorisch." >&2
usage
exit 1
fi
# Hauptlogik des Skripts
echo "--- Skriptausführung ---"
echo "Datei: ${FILE}"
if [ "${VERBOSE}" -eq 1 ]; then
echo "Ausführlicher Modus ist aktiviert."
fi
echo "Verbleibende Argumente: $@"
Erklärung von getopts
Die while-Schleife
getopts wird typischerweise in einer while-Schleife verwendet, die so lange läuft, wie Optionen gefunden werden.
Der optstring (":f:vh")
- Der erste Doppelpunkt (
:) aktiviert den "silent error handling"-Modus. Dadurch können Sie Fehler wie fehlende Argumente selbst abfangen. - Jeder Buchstabe repräsentiert eine gültige Option (
-f,-v,-h). - Ein Doppelpunkt nach einem Buchstaben (z.B.
f:) bedeutet, dass diese Option ein Argument erfordert.
Die case-Anweisung
$opt: Enthält die aktuell gefundene Option (z.B.f).$OPTARG: Enthält den Wert des Arguments, wenn eine Option einen erfordert (wie bei-f).:-Fall: Wird ausgelöst, wenn eine Option ein Argument erwartet, aber keines bereitgestellt wurde.\?-Fall: Wird für unbekannte oder ungültige Optionen ausgelöst.
$OPTIND und shift
$OPTIND: Ist ein Index, der auf die nächste zu verarbeitende Option zeigt. Nach der Schleife zeigt er auf das erste Argument, das keine Option ist.shift $((OPTIND - 1)): Dieser Befehl entfernt alle erkannten Optionen und deren Argumente aus der Liste der Positionsparameter ($@). Übrig bleiben nur die "normalen" Argumente, die nach den Optionen übergeben wurden.
Fazit
getopts ist ein robustes und portables Werkzeug für das Parsen einfacher Kommandozeilen-Optionen in Bash. Für komplexere Anforderungen mit langen Optionen (z.B. --verbose) oder anspruchsvollerer Validierung ist das externe Programm getopt (aus dem util-linux-Paket) eine mächtigere Alternative.