Vollständiger Leitfaden zum Linux-Shell-Skript-Befehl read – Von der Benutzereingabe bis zum zeilenweisen Lesen von Dateien: Praxistipps

Übersicht

In diesem Artikel behandeln wir die wesentliche Nutzung des Befehls read, der beim Schreiben von Linux-Bash-Shell-Skripten für die interaktive Verarbeitung von Benutzereingaben und das Parsen von Textdaten unverzichtbar ist. Von der grundlegenden Eingabeverarbeitung über die Passworterfassung (-s), Timeouts (-t) und Trennzeichenaufteilung (IFS) bis hin zur in der Praxis am häufigsten verwendeten zeilenweisen Dateiverarbeitung mittels while-Schleife können Sie alles umfassend meistern.

1. Grundlagen des read-Befehls, Eingabeaufforderung (-p) und Standardwerte

Führen Sie den Befehl mkdir -p ~/read-demo && cd ~/read-demo aus, um ein dediziertes Verzeichnis für die praktischen Übungen zum read-Befehl zu erstellen und dorthin zu wechseln.

mkdir -p ~/read-demo && cd ~/read-demo

Der Befehl read liest eine Zeile von der Standardeingabe ein und speichert sie in einer Variablen. Mit der Option -p lässt sich ein Hinweistext für den Benutzer ausgeben, und mit der Syntax ${Variablenname:-Standardwert} kann ein Standardwert zugewiesen werden, falls der Wert leer ist.
Im Ausführungsergebnis wurde keine direkte Eingabe an den Befehl read übergeben, sodass die Variable username leer blieb und gemäß der Syntax ${username:-guest} der Standardwert guest ausgegeben wurde.
⚙️ [Wichtige Optionen]

-p : Gibt eine Eingabeaufforderung (Prompt-String) an, die vor der Eingabe auf dem Bildschirm angezeigt werden soll.
-s : Aktiviert den Silent-Modus, bei dem eingegebene Zeichen nicht auf dem Bildschirm angezeigt werden (z. B. bei sensiblen Daten wie Passwörtern).
-t : Legt ein Zeitlimit (in Sekunden) für die Eingabe fest; nach Ablauf der Zeit wird die Eingabe beendet.
-n : Liest nur die angegebene Anzahl an Zeichen ein und beendet die Eingabe sofort, ohne dass die Eingabetaste gedrückt werden muss.
-r : Verhindert die Interpretation von Backslashes (\) als Escape-Zeichen und liest sie originalgetreu ein.
-a : Teilt eingegebene Wörter anhand von Leerzeichen auf und speichert sie sequenziell in einer Array-Variablen.
-d : Legt ein benutzerdefiniertes Trennzeichen (Delimiter) fest, das die Eingabe anstelle eines Zeilenumbruchs beendet.

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. Passwort-Maskierung (-s) und Eingabe-Timeout (-t)

Wechseln Sie mit dem Befehl cd ~/read-demo in das zuvor erstellte Verzeichnis ~/read-demo, um mit der Übung fortzufahren.

cd ~/read-demo

Mit der Option -s wird die Bildschirmanzeige maskiert und mit -t 5 ein Zeitlimit von 5 Sekunden für die Eingabe gesetzt.
Da das Passwort innerhalb des Zeitlimits ordnungsgemäß übergeben wurde, wird der Exit-Statuscode ($?) als 0 ausgegeben.

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. Aufteilung in mehrere Variablen und Arrays mit Trennzeichen (IFS) und der Option -a

Wechseln Sie mit dem Befehl cd ~/read-demo in das zuvor erstellte Verzeichnis ~/read-demo, um mit der Übung fortzufahren.

cd ~/read-demo

Nachdem der interne Feldtrenner (IFS) auf ein Komma (,) gesetzt wurde, liest der Befehl read eine via Here-String (<<<) übergebene Zeichenkette im CSV-Format ein und teilt sie separat in die Variablen col1, col2 und col3 auf.
Im Ausführungsergebnis wurden Servername, IP-Adresse und Dienstname aus der Zeichenkette entsprechend dem definierten Trennzeichen erfolgreich aufgeteilt und den jeweiligen Variablen zugewiesen ausgegeben.

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

Indem das Trennzeichen (IFS) als Doppelpunkt (:) festgelegt und mit der Option -a kombiniert wird, wird eine Zeichenkette im Format von /etc/passwd aufgeteilt und in der Array-Variablen user_info gespeichert.
Der Kontoname (root) an Index 0 sowie der Login-Shell-Pfad (/bin/bash) an Index 6 des Arrays wurden erfolgreich extrahiert und ausgegeben.

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. Kernkompetenz der Praxis: Zeilenweise Verarbeitung großer Dateien mit while-Schleife und read -r

Wechseln Sie mit dem Befehl cd ~/read-demo in das zuvor erstellte Verzeichnis ~/read-demo, um mit der Übung fortzufahren.

cd ~/read-demo

Erstellen Sie für die praktische Übung zur zeilenweisen Dateiverarbeitung eine Beispiel-CSV-Datei namens servers.csv, in der Servername und Betriebsstatus durch Kommas getrennt sind.

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

Durch die Kombination einer while-Schleife mit dem Befehl read -r und dem Setzen des internen Feldtrenners (IFS) auf ein Komma (,) wird jede Zeile der Datei servers.csv sicher zeilenweise eingelesen.
Im Ausführungsergebnis wurden die in der Datei hinterlegten Servernamen und Statusinformationen ordnungsgemäß den Variablen name und status zugewiesen und entsprechend formatiert ausgegeben.

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

Bisher haben wir uns einen kompakten Überblick über die grundlegende Nutzung des Befehls read in Linux-Shell-Skripten bis hin zu praxisnahen Techniken für das zeilenweise Lesen von Dateien verschafft.
Nutzen Sie die heute vorgestellten Optionen und Beispiele gerne als Basis, um eigene interaktive Automatisierungsskripte für Ihre jeweiligen Anforderungen zu erstellen.