ファイルを1行ずつ読み取り、値を変数に割り当てる [重複] 質問する

ファイルを1行ずつ読み取り、値を変数に割り当てる [重複] 質問する

次の .txt ファイルがあります:

Marco
Paolo
Antonio

これを 1 行ずつ読み取り、各行に対して .txt 行の値を変数に割り当てたいと思います。変数が であるとすると$name、フローは次のようになります。

  • ファイルから最初の行を読み込む
  • 割り当て$name= "Marco"
  • いくつかのタスクを実行する$name
  • ファイルから2行目を読み込む
  • 割り当て$name= "Paolo"

ベストアンサー1

以下は、引数として渡されたファイルを行ごとに読み取ります。

while IFS= read -r line; do
    echo "Text read from file: $line"
done < my_filename.txt

これは標準形式ループ内でファイルから行を読み取ります。説明:

  • IFS=(またはIFS='') は先頭/末尾の空白が切り捨てられないようにします。
  • -rバックスラッシュエスケープが解釈されるのを防ぎます。

または、bash ファイル ヘルパー スクリプトに含めることもできます。例の内容は次のとおりです。

#!/bin/bash
while IFS= read -r line; do
    echo "Text read from file: $line"
done < "$1"

上記をファイル名のスクリプトに保存するとreadfile、次のように実行できます。

chmod +x readfile
./readfile filename.txt

ファイルが標準POSIXテキストファイル(= 改行文字で終了しない) ループを変更して、末尾の部分的な行を処理することができます。

while IFS= read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"

ここで、|| [[ -n $line ]]最後の行が で終わらない場合に無視されることを防ぎます\n( readEOF に遭遇すると 0 以外の終了コードを返すため)。

ループ内のコマンドも標準入力から読み取る場合、使用されるファイル記述子はread別のものに変更することができます(標準ファイル記述子)、例:

while IFS= read -r -u3 line; do
    echo "Text read from file: $line"
done 3< "$1"

(Bash 以外のシェルは認識しない可能性がありますread -u3。代わりに を使用してくださいread <&3。)

おすすめ記事