Benutzereingaben in Bash-Skripten verarbeiten
June 5, 2014
Ein wesentlicher Aspekt von flexiblen Shell-Skripten ist die Fähigkeit, Eingaben zu verarbeiten. In Bash gibt es grundsätzlich zwei Wege, um Daten von einem Benutzer oder einem anderen Prozess zu erhalten:
- Interaktive Eingabe: Das Skript pausiert und wartet auf eine Eingabe des Benutzers über die Tastatur. Dies wird mit dem
read-Befehl realisiert. - Kommandozeilen-Argumente: Werte werden dem Skript direkt beim Aufruf übergeben. Dies ist die bevorzugte Methode für die Automatisierung.
Methode 1: Interaktive Eingabe mit read
Der read-Befehl liest eine einzelne Zeile von der Standardeingabe und speichert sie in einer oder mehreren Variablen.
Einfaches Beispiel
#!/usr/bin/env bash
echo "Bitte geben Sie Ihren Namen ein:"
read user_name
echo "Hallo, $user_name!"
Verbesserte Variante mit Prompt
Die Option -p ermöglicht es, einen Prompt-Text direkt auszugeben, ohne ein separates echo. Die Option -r verhindert die Interpretation von Backslash-Zeichen.
#!/usr/bin/env bash
# -p: Zeigt einen Prompt an
# -r: "raw mode", interpretiert Backslashes nicht
read -r -p "Geben Sie Ihren Namen ein: " user_name
echo "Willkommen, $user_name!"
Versteckte Eingabe (für Passwörter)
Die Option -s ("silent") verhindert, dass die Eingabe auf dem Bildschirm angezeigt wird.
read -s -p "Geben Sie Ihr Passwort ein: " user_password
echo # Fügt eine neue Zeile nach der Passworteingabe hinzu
Methode 2: Kommandozeilen-Argumente
Argumente werden dem Skript beim Aufruf übergeben und über Positionsparameter ($1, $2, etc.) angesprochen. Diese Methode ist ideal für die Automatisierung, da keine Benutzerinteraktion erforderlich ist.
Aufruf:
./mein_skript.sh "John Doe" "Administrator"
Skript (mein_skript.sh):
#!/usr/bin/env bash
# Überprüft, ob mindestens zwei Argumente übergeben wurden
if [ "$#" -ne 2 ]; then
echo "Fehler: Es werden genau zwei Argumente benötigt (Name und Rolle)." >&2
echo "Verwendung: $0 <name> <rolle>"
exit 1
fi
NAME="$1"
ROLE="$2"
echo "Benutzer: $NAME"
echo "Rolle: $ROLE"
$#: Enthält die Anzahl der Argumente.$0: Enthält den Namen des Skripts.
Kombination beider Methoden
Ein häufiges Muster ist, ein Argument als optionale Eingabe zu behandeln und den Benutzer interaktiv zu fragen, falls es nicht übergeben wurde.
#!/usr/bin/env bash
# Weist das erste Argument der Variable 'name' zu.
# Wenn $1 leer ist, bleibt 'name' zunächst leer.
name="$1"
# Prüft, ob die Variable 'name' leer ist.
if [ -z "$name" ]; then
# Wenn ja, frage den Benutzer interaktiv.
read -r -p "Bitte geben Sie einen Namen ein: " name
fi
echo "Hallo, $name!"
Dieses Skript kann auf zwei Arten verwendet werden:
- Nicht-interaktiv:
./skript.sh "Alice" - Interaktiv:
./skript.sh(fragt anschließend nach dem Namen)
Fazit
Die Wahl zwischen read und Kommandozeilen-Argumenten hängt vom Anwendungsfall ab. Für Skripte, die in automatisierten Workflows (z.B. CI/CD) laufen sollen, sind Argumente zwingend erforderlich. Für reine Hilfsskripte, die von einem Benutzer manuell ausgeführt werden, kann die interaktive Abfrage mit read benutzerfreundlicher sein.