2015-07-04 7 views
5

I Sprache und eine Prüfung Spur bin zu studieren, sagt dieser:lesen Zeile für Zeile von der Standardeingabe Bash

Es einen Eingang (von der Standardeingabe) zu einem Zeitpunkt (jeder Eintrag lesen sollte ist eine Zeichenfolge und endet dann mit einem Zeilenumbruch).

Meine Fragen sind zwei:

  1. Wie lese ich Zeile für Zeile von der Standardeingabe in Bash? Bis jetzt habe ich "read string" verwendet, aber ich denke nicht, dass es eine Zeile zu einer Zeit liest.

  2. Ich weiß nicht, ob das eine dumme Frage ist, aber einmal das Skript erstellt, wie kann ich dem Skript mehr Zeilen als Eingabe geben (gelesen von der Standardeingabe natürlich). Zum Beispiel von ich zwei Zeilen einfügen (hello und world). Wie gebe ich dem Bash-Skript diese zwei Zeilen?

Antwort

8

1) Wie lese ich Zeile für Zeile von der Standardeingabe in Bash? Bis jetzt habe ich verwendet "Lesezeichenkette" aber ich denke nicht, dass es eine Zeile hintereinander liest.

Der Prototyp für read ist:

read [options] name[s ...] 

read eine line der Eingabe in name name1 name2 ... Aufspaltung der Linie auf den Inhalt des internen Feld Separator (IFS) basiert lesen. Der Standardwert für IFS ist ' \t\n' (also spacetabnewline). Wenn Sie nur eine einzelne Variable an read übergeben, lesen Sie die gesamte Zeile in diese Variable (es sei denn, Sie haben ein neues Trennzeichen mit der Option -d auf read gesetzt). Wenn Sie mehr als eine Variable angeben (z. B. read -r name name1), erfolgt die Worttrennung basierend auf dem aktuellen Wert IFS. Bedeutung, wenn Sie die Zeichenfolge liefern hello world zu:

read -r name 

name="hello world". Auf der anderen Seite, wenn Sie bieten die gleiche Zeichenfolge an:

read -r name name1 

name="hello", name1="world". Was ist, wenn Sie überzählige Wörter in der Zeile haben, aber nur 2 Variablen? Sagen Sie Ihre Zeichenfolge jetzt "hello big wide world" ist, was mit passiert:

read -r name name1 

name="hello", name1="big wide world". Die Wörter in string werden Ihren Variablen in der Reihenfolge zugewiesen, und wenn es nicht genügend Variablen gibt, um jedes Wort in der Zeichenfolge zu speichern, enthält die letzte Variable alle verbleibenden Wörter in Zeichenfolge, die zuvor nicht zugewiesen wurden.

Sie ändern, wie Wort Spaltung erfolgt durch IFS zu verändern. Sehen Sie sich die Antwort von anubhava für ein Beispiel genau an. Sie können ein beliebiges Zeichen angeben, auf das die Wörter aufgeteilt werden sollen. (Hilfreich in etwa eine csv Datei Parsen IFS=$',\n' zu setzen und haben die Worte auf ',' statt Raum geteilt)

Sie eine ganze Zeile in eine Variable zu lesen, um sicherzustellen, können Sie nur eine einzige Variable read liefern und setzen IFS='$\n' zu Stellen Sie sicher, dass die Worttrennung nur unter newline erfolgt. (Hinweis: Bereitstellung der Änderung als Teil der while Schleife begrenzt die IFS Änderung des Umfangs dieser Schleife. Zum Beispiel:

while IFS='$\n' read -r line; do 
    # do whatever with line 
done 

wird sichergestellt, dass jede Zeile auf stdin wird in line gelesen werden, während normale Erhaltung Wort-Spaltung außerhalb der Schleife. Innerhalb der Schleife Sie dann jede Zeile in einem Array als anubhava zeigt in seiner Antwort hinzufügen können. (alle Leerzeichen IFS= zu erhalten verwendet wird)

4

Sie können etwas tun:

# array to hold all lines read 
lines=() 

# read all lines in lines array 
while IFS= read -r line; do 
    lines+=("$line") 
done < file 

# read 3 more lines from stdin 
for ((i=0; i<3; i++)); do 
    read -rp "Enter a line: " line 
    lines+=("$line") 
done