web-dev-qa-db-ja.com

変数に値を代入してファイルを1行ずつ読み込む

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

Marco
Paolo
Antonio

1行ずつ読みたいので、1行ごとに変数に.txt行の値を割り当てます。私の変数を$nameとすると、フローは次のようになります。

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

次のように(rr.shとして保存)、引数として渡されたファイルを1行ずつ読み込みます。

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

説明:

  • IFS=''(またはIFS=)は、前後の空白が削除されないようにします。
  • -rはバックスラッシュエスケープが解釈されるのを防ぎます。
  • 最後の行が|| [[ -n $line ]]で終わっていない場合、\nは最後の行が無視されないようにします(readはEOFに遭遇するとゼロ以外の終了コードを返すため)。

次のようにスクリプトを実行してください。

chmod +x rr.sh
./rr.sh filename.txt

…….

1142
cppcoder

readには-rフラグを使用することをお勧めします。

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

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

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

これが更新されたコードです。

#!/usr/bin/bash
filename="$1"
while read -r line; do
    name="$line"
    echo "Name read from file - $name"
done < "$filename"
283

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

while read name; do
    # Do what you want to $name
done < filename
119
OneWinged
#! /bin/bash
cat filename | while read LINE; do
    echo $LINE
done
60
Gert

多くの人が過度に最適化されたソリューションを投稿しています。私はそれが間違っているとは思いませんが、誰もがこれがどのように機能しているかを容易に理解できるようにするためには、あまり最適化されていないソリューションが望ましいと謙虚に思います。これが私の提案です:

#!/bin/bash
#
# This program reads lines from a file.
#

end_of_file=0
while [[ $end_of_file == 0 ]]; do
  read -r line
  # the last exit status is the 
  # flag of the end of file
  end_of_file=$?
  echo $line
done < "$1"
20
Raul Luna

つかいます:

filename=$1
IFS=$'\n'
for next in `cat $filename`; do
    echo "$next read from $filename" 
done
exit 0

あなたがIFSを異なって設定したならば、あなたは奇妙な結果を得るでしょう。

18
user3546841

入力ファイルとユーザー入力の両方(または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リダイレクトのチュートリアル に基づく。

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

9
gluk47

適切なエラー処理のために:

#!/bin/bash

set -Ee    
trap "echo error" EXIT    
test -e ${FILENAME} || exit
while read -r line
do
    echo ${line}
done < ${FILENAME}
7
bviktor

BashでIFS(内部フィールド区切り)ツールを使用し、行をトークンに分割するために使用する文字を定義します。デフォルトでは、<tab>/<space>/<newLine>

ステップ1:ファイルデータをロードし、リストに挿入します。

# declaring array list and index iterator
declare -a array=()
i=0

# reading file in row mode, insert each line into array
while IFS= read -r line; do
    array[i]=$line
    let "i++"
    # reading from file path
done < "<yourFullFilePath>"

ステップ2:出力を繰り返して出力します:

for line in "${array[@]}"
  do
    echo "$line"
  done

配列内のエコー固有のインデックス:配列内の変数へのアクセス:

echo "${array[0]}"
0
avivamg

以下はファイルの内容を表示するだけです。

cat $Path/FileName.txt

while read line;
do
echo $line     
done
0
Rekha Ghanate