868

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

Marco
Paolo
Antonio

行ごとに読み取りたいのですが、行ごとに .txt 行の値を変数に割り当てたいのです。私の変数が$nameであると仮定すると、フローは次のとおりです。

  • ファイルから最初の行を読み取る
  • 割り当て$name= "マルコ"
  • でいくつかのタスクを実行します$name
  • ファイルから 2 行目を読み取る
  • 割り当て$name= "パオロ"
4

10 に答える 10

1557

次の例では、引数として渡されたファイルを 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"

上記が filename のスクリプトに保存されている場合、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 ]]は、最後の行が a で終わらない場合に無視されないようにします\n( readEOF に遭遇したときにゼロ以外の終了コードを返すため)。

ループ内のコマンドが標準入力からも読み取る場合、によって使用されるファイル記述子は別のものに変更できます (標準のファイル記述子readは避けてください)。

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

(非 Bash シェルは知らないかもしれません。代わりにread -u3使用してください。)read <&3

于 2012-06-07T09:53:38.333 に答える
334

以下を表す-rフラグを使用することをお勧めします。read

-r  Do not treat a backslash character in any special way. Consider each
    backslash to be part of the input line.

から引用していman 1 readます。

もう 1 つの方法は、ファイル名を引数として取ることです。

更新されたコードは次のとおりです。

#!/usr/bin/bash
filename="$1"
while read -r line; do
    name="$line"
    echo "Name read from file - $name"
done < "$filename"
于 2012-06-07T10:24:31.930 に答える
145

次の Bash テンプレートを使用すると、ファイルから一度に 1 つの値を読み取って処理できます。

while read name; do
    # Do what you want to $name
done < filename
于 2012-06-07T09:55:10.487 に答える
11

入力ファイルとユーザー入力 (または stdin からのその他のもの) の両方を処理する必要がある場合は、次の解決策を使用します。

#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
    read -p "> $line (Press Enter to continue)"
done

受け入れられた回答bash-hackers redirection tutorialに基づいています。

ここでは、スクリプト引数として渡されたファイルのファイル記述子 3 を開き、readこの記述子を入力 ( -u 3) として使用するように指示します。したがって、デフォルトの入力記述子 (0) を端末または別の入力ソースにアタッチしたままにし、ユーザー入力を読み取ることができるようにします。

于 2016-02-01T12:58:05.137 に答える