Der read-Befehl liest eine Zeile von der Standardeingabe und speichert sie in einer oder mehreren Variablen. Er ist unverzichtbar für interaktive Bash-Skripte, die Benutzereingaben verarbeiten.

Syntax

read [OPTIONEN] [VARIABLE...]

Ohne Variablenangabe speichert read die gesamte Eingabe in der vordefinierten Variablen REPLY.

Grundlegende Verwendung

Gib im Terminal read name ein und drücke Enter. Der Befehl wartet auf deine Eingabe:

read name
Dominic

Die Eingabe landet in der Variablen name:

echo $name
Dominic

Mehrere Variablen

read teilt die Eingabe an Leerzeichen auf und weist jedes Wort einer Variablen zu:

echo "Hallo Welt" | read var1 var2
echo "$var1"
echo "$var2"
Hallo
Welt

Gibt es mehr Wörter als Variablen, erhält die letzte Variable den gesamten Rest:

echo "Linux ist großartig" | (read var1 var2; echo "var1: $var1"; echo "var2: $var2")
var1: Linux
var2: ist großartig

Gibt es weniger Wörter als Variablen, bleiben die übrigen Variablen leer.

Wichtige Optionen

Die Option -r (raw)

Standardmäßig interpretiert read den Backslash als Escape-Zeichen. Das führt oft zu unerwartetem Verhalten:

echo "Pfad: C:\temp" | (read; echo "$REPLY")
Pfad: C:    emp

Mit -r wird der Backslash wörtlich übernommen:

echo "Pfad: C:\temp" | (read -r; echo "$REPLY")
Pfad: C:\temp

Verwende read immer mit -r, außer du benötigst explizit die Backslash-Interpretation.

Die Option -p (prompt)

Mit -p zeigst du eine Eingabeaufforderung an:

read -r -p "Wie heißt du? " name
echo "Hallo, $name!"

Die Option -s (silent)

Die Option -s unterdrückt die Anzeige der Eingabe. Ideal für Passwörter:

read -r -s -p "Passwort: " passwort
echo
echo "Passwort wurde gespeichert."

Die Option -a (array)

Mit -a speicherst du die Wörter in einem Array statt in einzelnen Variablen:

read -r -a woerter <<< "eins zwei drei"

for wort in "${woerter[@]}"; do
    echo "$wort"
done
eins
zwei
drei

Das Trennzeichen ändern

Standardmäßig trennt read die Eingabe an Leerzeichen, Tabs und Zeilenumbrüchen. Mit der Variablen IFS (Internal Field Separator) änderst du das Trennzeichen:

echo "root:x:0:0:root:/root:/bin/bash" | (IFS=":" read -r user x uid gid info home shell; echo "User: $user, Home: $home")
User: root, Home: /root

Das ist besonders nützlich zum Parsen von CSV-Dateien oder /etc/passwd.

Mehrere Trennzeichen gibst du direkt hintereinander an:

echo "wert1-wert2_wert3" | (IFS="-_" read -r a b c; echo "$a / $b / $c")
wert1 / wert2 / wert3

Praktische Beispiele

Bestätigung abfragen

Eine typische Ja/Nein-Abfrage mit Schleife:

while true; do
    read -r -p "Fortfahren? (j/n): " antwort
    case $antwort in
        [Jj]* ) echo "Wird ausgeführt..."; break;;
        [Nn]* ) echo "Abgebrochen."; exit;;
        * ) echo "Bitte j oder n eingeben.";;
    esac
done

Datei zeilenweise lesen

Kombiniere read mit einer while-Schleife, um eine Datei Zeile für Zeile zu verarbeiten:

while IFS= read -r zeile; do
    echo "Zeile: $zeile"
done < /etc/hostname

Die Konstruktion IFS= stellt sicher, dass führende und folgende Leerzeichen erhalten bleiben.

Timeout setzen

Mit -t brichst du die Eingabe nach einer bestimmten Anzahl von Sekunden ab:

if read -r -t 5 -p "Eingabe (5 Sekunden): " eingabe; then
    echo "Du hast eingegeben: $eingabe"
else
    echo "Zeit abgelaufen."
fi

Zusammenfassung

Der read-Befehl liest Eingaben von der Standardeingabe und speichert sie in Variablen. Die wichtigsten Optionen:

OptionBeschreibung
-rBackslash nicht als Escape-Zeichen interpretieren
-pEingabeaufforderung anzeigen
-sEingabe nicht anzeigen (für Passwörter)
-aEingabe in Array speichern
-tTimeout in Sekunden

Verwende read immer mit der Option -r, um unerwartetes Verhalten durch Backslash-Interpretation zu vermeiden.