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 space
tab
newline
). 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)