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

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:

  1. Interaktive Eingabe: Das Skript pausiert und wartet auf eine Eingabe des Benutzers über die Tastatur. Dies wird mit dem read-Befehl realisiert.
  2. 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

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

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

code
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:

code
./mein_skript.sh "John Doe" "Administrator"

Skript (mein_skript.sh):

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

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