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.
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
++; 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
@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