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:
| Option | Beschreibung |
|---|---|
-r | Backslash nicht als Escape-Zeichen interpretieren |
-p | Eingabeaufforderung anzeigen |
-s | Eingabe nicht anzeigen (für Passwörter) |
-a | Eingabe in Array speichern |
-t | Timeout in Sekunden |
Verwende read immer mit der Option -r, um unerwartetes Verhalten durch Backslash-Interpretation zu vermeiden.