1. ホーム
  2. バッシュ

[解決済み】ファイルを一行ずつ読み込んで変数に値を代入する【重複あり

2022-03-23 18:38:35

質問

以下の.txtファイルがあります。

Marco
Paolo
Antonio

それを一行ずつ読んで、一行ごとに.txtの行の値を変数に代入したいのです。仮に私の変数が $name という流れになります。

  • ファイルから最初の行を読み込む
  • アサイン $name = "Marco"。
  • でいくつかのタスクを実行します。 $name
  • ファイルから2行目を読み込む
  • アサイン $name = "パオロ"。

解決方法は?

以下は、引数として渡されたファイルを一行ずつ読み込むものです。

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 (このため read はEOFに遭遇すると0以外の終了コードを返します)。

ループ内のコマンドも標準入力から読み込む場合、ファイルディスクリプタは read は他のものに変更することができます。 標準ファイル記述子 )、例えば

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

(Bash以外のシェルでは read -u3 を使用します。 read <&3 の代わりに)