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▸▸▸

Verarbeitung von Kommandozeilen-Argumenten in Bash-Skripten

December 7, 2015

Kommandozeilen-Argumente sind Werte, die einem Skript beim Aufruf übergeben werden. Sie sind fundamental für die Erstellung von flexiblen und wiederverwendbaren Shell-Skripten.

Beispielaufruf:

code
./mein_skript.sh "erstes Argument" "zweites Argument"

Bash stellt eine Reihe von speziellen Variablen, den sogenannten Positionsparametern, zur Verfügung, um auf diese Argumente zuzugreifen.


Wichtige Positionsparameter

  • $0: Enthält den Namen des Skripts selbst.
  • $1, $2, $3, ...: Enthalten das erste, zweite, dritte, ... Argument.
  • $#: Enthält die Gesamtzahl der übergebenen Argumente (ohne den Skriptnamen).
  • $@: Repräsentiert alle Argumente als eine Liste von einzelnen, in Anführungszeichen gesetzten Strings. Dies ist die sicherste und empfohlene Methode, um alle Argumente zu verarbeiten.
  • $*: Repräsentiert alle Argumente als einen einzigen String, wobei die Argumente durch das erste Zeichen der IFS-Variable (Internal Field Separator, standardmäßig ein Leerzeichen) getrennt sind.

Beispiel-Skript:

code
#!/usr/bin/env bash

echo "Skriptname: $0"
echo "Erstes Argument: $1"
echo "Zweites Argument: $2"
echo "Anzahl der Argumente: $#"
echo "Alle Argumente (als Liste): $@"

Der Unterschied zwischen "$@" und "$*"

Der Unterschied wird deutlich, wenn Argumente Leerzeichen enthalten.

  • "$@" (empfohlen): Behandelt jedes Argument als separates Element.
  • "$*": Fasst alle Argumente zu einem einzigen String zusammen.

Beispiel:

code
#!/usr/bin/env bash

echo "--- Mit \"\$@\" ---"
for arg in "$@"; do
  echo "Argument: [$arg]"
done

echo ""
echo "--- Mit \"\$*\" ---"
for arg in "$*"; do
  echo "Argument: [$arg]"
done

Aufruf: ./test.sh "Argument 1" "Zwei Wörter"

Ausgabe:

code
--- Mit "$@" ---
Argument: [Argument 1]
Argument: [Zwei Wörter]

--- Mit "$*" ---
Argument: [Argument 1 Zwei Wörter]

"$@" ist für Schleifen und die Weitergabe von Argumenten an andere Befehle fast immer die richtige Wahl.


Argumente mit shift verarbeiten

Der shift-Befehl "verschiebt" die Positionsparameter nach links. $2 wird zu $1, $3 wird zu $2 und so weiter. Dies ist nützlich, um Argumente nacheinander zu verarbeiten, insbesondere in Kombination mit getopts für das Parsen von Optionen.

Beispiel:

code
#!/usr/bin/env bash

while [ $# -gt 0 ]; do
  echo "Aktuelles Argument: $1"
  echo "Verbleibende Argumente: $(($# - 1))"
  shift
done

Fazit

Die korrekte Verarbeitung von Kommandozeilen-Argumenten ist entscheidend für robuste Bash-Skripte. Verwenden Sie immer Anführungszeichen um die Positionsparameter (z.B. "$1", "$@") um Probleme mit Leerzeichen und anderen Sonderzeichen zu vermeiden. Für das Parsen von Optionen (Flags wie -f oder --file) sollte das getopts-Builtin verwendet werden.