TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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.

code
#!/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.