2016-10-29 9 views
0

mein Ziel ist jede Zeile eines Textes TTSWie lese ich Zeilen aus einer Datei in einer Schleife?

erste Datei ich die Anzahl der Zeilen meiner Textdatei zählen:

#!/bin/bash 

LINES=$(cat /home/mytext.txt | wc -l) 

Ich möchte eine Schleife definieren:

let "n = $LINES" 
while [ $n -ne 0 ] 

TTS "the first line" 
sleep 5 

let "n--" 
done 
exit 

Dann wiederholt sich die Schleife, um die nächste Zeile zu lesen ... usw., solange die nächste Zeile existiert.

Antwort

2

Was Sie wollen, ist zu read:

cat /home/mytext.txt |\ 
while IFS='' read -r CUR_LINE || [ -n "$CUR_LINE" ]; do 
    do_something_with "$CUR_LINE" 
done 

Sie wird: Katze Textdatei, um die nächste Zeile lesen, bis keine weiteren Zeilen übrig sind und mit jeder Zeile etwas tun. Beachten Sie, dass das Bit || [ -n "$CUR_LINE" ] sicherstellen soll, dass, wenn die Textdatei nicht mit einer leeren Zeile endet, die while nicht mit einem Fehlerstatus endet (Beendigungscode ungleich Null). Das ist wichtig, wenn Sie Ihr Skript mit set -e ausführen (um bei einem Fehler zu beenden).

+2

Re: "Das ist wichtig, wenn Sie Ihr Skript mit' set -e' (um bei Fehler zu beenden) ": Eh? Das scheint völlig irrelevant und unabhängig von mir. Der Grund für das '|| [-n "$ CUR_LINE"] 'ist so, dass wenn die Eingabe eine abschließende neue Zeile fehlt, die letzte Zeile immer noch verarbeitet wird. – ruakh

+2

++; Besser ist es jedoch, die Eingabeumleitung ('<') nach dem 'done' zu ​​verwenden, um eine Eingabe zu liefern, anstatt eine Pipeline zu verwenden - und daher subshells - mit' cat'. (Sie haben sich absichtlich dafür entschieden, '\' zu verwenden, um hier ausdrücklich das Zeilenfortsetzungszeichen anzugeben, aber beachten Sie, dass es nach '|' nicht notwendig ist - wenn die aktuelle Zeile kein vollständiger Befehl ist, wird Bash weiter mit der folgenden Syntax arbeiten Linie (n)). – mklement0

+0

@ruakh: Guter Punkt über den Grund. 'set -e' ist in der Tat irrelevant_, aber nicht _unrelated_:" Die '-e'-Einstellung sollte ignoriert werden, wenn die Verbindungsliste nach dem' while ',' bis ',' if 'oder' elif 'ausgeführt wird Wort, eine Pipeline, die mit dem '!' reservierten Wort oder einem anderen Befehl einer AND-OR-Liste als dem letzten beginnt. " - aus der [POSIX-Spezifikation] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25_03). Mit anderen Worten: 'set -e' gilt explizit nicht für Befehle, die in _conditionals_ ausgeführt werden (neben anderen Ausnahmen). – mklement0

Verwandte Themen