Bashで読み取りコマンドを使用してファイルを1行ずつ読み込むことは機能しません。

Bashで読み取りコマンドを使用してファイルを1行ずつ読み込むことは機能しません。

text.txtこのようなファイルがあります。

line1
line2
line3

各行を繰り返してエコーするスクリプトを作成したいと思います。

modified line1
modified line2
modified line3

以下は非常に一般的なソリューションのスクリプトです。

while IFS= read -r line; do
  echo modified $line
done <<< $(cat ~/text.txt)

しかし、私が得た結果は次のとおりです。

modified line1 line2 line3

何が間違っていますか?

答え1

問題は最後の行にあります。変数(コマンドの置き換え)が不要であるか、ファイルをすでに読み取ることができるcatためです。readこれにより:

while IFS= read -r line; do
  echo modified $line
done < ~/text.txt

効果がある

また、次のように変数を引用すると、コマンドが機能します。

"$(cat ~/text.txt)"

bashは、引用しない限り、変数の改行文字を無視するためです。しかし、これは状況を過度に複雑にする。

関連情報