次の Bash スクリプトがあるとします。
while read SCRIPT_SOURCE_LINE; do
echo "$SCRIPT_SOURCE_LINE"
done
最後に改行がないファイルの場合、これにより最後の行が効果的にスキップされることに気付きました。
私は解決策を探し回り、これを見つけました:
読み取りが行末ではなくファイルの終わりに達すると、データを読み取って変数に割り当てますが、ゼロ以外のステータスで終了します。ループが構築されている場合は、「読み取り中;実行中;実行中」
そのため、読み取り終了ステータスを直接テストする代わりに、フラグをテストし、読み取りコマンドでループ本体内からそのフラグを設定します。そうすれば、読み取りの終了ステータスに関係なく、ループ本体全体が実行されます。これは、読み取りが他のコマンドと同様にループ内のコマンドのリストの 1 つにすぎず、ループが実行されるかどうかの決定要因ではないためです。
DONE=false until $DONE ;do read || DONE=true # process $REPLY here done < /path/to/file.in
while入力ファイルの場所をハードコーディングせずに、以前のループとまったく同じように動作するように、このソリューションを書き直すにはどうすればよいですか?