2016-10-29 20 views
0

私の目標は、私は私のテキストファイルの行数をカウントし、テキストファイルの各行ループ内のファイルから行を読み込む方法は?

まずTTSことです:

#!/bin/bash 

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

私はループを定義したい:

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

TTS "the first line" 
sleep 5 

let "n--" 
done 
exit 

次に、次の行が存在する限り、ループは繰り返されます。何をしたい

答えて

2

readにある:

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

それ以下となります。猫のテキストファイルを、もう行が残っていないまで、次の行を読み込み、各行で何かを。 || [ -n "$CUR_LINE" ]ビットは、テキストファイルが空白行で終わらない場合、whileがエラー状態(ゼロ以外の終了コード)で終わらないようにすることです。 set -eでスクリプトを実行した場合(エラー時に終了する)は重要です。

+2

Re:「set -e」(エラー時に終了する)でスクリプトを実行すると問題が発生します。それはまったく無関係で、私と無関係のようです。 '|| [-n "$ CUR_LINE"] 'は入力に改行がない場合、最後の行はまだ処理されます。 – ruakh

+2

++;しかし、パイプライン(したがってサブシェル)を 'cat'で使用するのではなく、' done'の後に入力リダイレクション( '<')を使用して入力を提供する方が良いでしょう。 (あなたは意図的に '\'を使って明示的に行継続文字を表示することができますが、 '|'の後には必要ないことに注意してください - 現在の行が完全なコマンドでない場合、行(s))。 – mklement0

+0

@ruakh:理由についての良い点。 'set -e'は実際にはこれにはまったく関係ありませんが、関連していません_:' while'、 'until'、' if'、または 'elif'予約に続いて複合リストを実行するときに' -e'設定は無視されますword、 '! '予約語で始まるパイプライン、または最後のもの以外のAND-ORリストのコマンドであることを意味します。 - [POSIX仕様](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25_03)。言い換えれば、 'set -e'は_conditionals_で実行されるコマンドには明示的には適用されません。 – mklement0

関連する問題