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:
./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 derIFS-Variable (Internal Field Separator, standardmäßig ein Leerzeichen) getrennt sind.
Beispiel-Skript:
#!/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:
#!/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:
--- 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:
#!/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.