it-swarm.com.de

Liest eine Datei Zeile für Zeile und weist den Wert einer Variablen zu

Ich habe die folgende TXT-Datei:

Marco
Paolo
Antonio

Ich möchte es Zeile für Zeile lesen, und für jede Zeile möchte ich einer .txt einen Zeilenwert zuweisen. Angenommen, meine Variable ist $name, lautet der Fluss:

  • Lesen Sie die erste Zeile aus der Datei
  • $name = "Marco" zuordnen
  • Erledige einige Aufgaben mit $name
  • Zweite Zeile aus Datei lesen
  • $name = "Paolo" zuordnen
610
Marco

Folgendes (als rr.sh speichern) liest eine Datei, die zeilenweise als Argument übergeben wird:

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

Erläuterung:

  • IFS='' (oder IFS=) verhindert, dass führende/nachgestellte Leerzeichen abgeschnitten werden.
  • -r verhindert, dass Backslash-Fluchten interpretiert werden.
  • || [[ -n $line ]] verhindert, dass die letzte Zeile ignoriert wird, wenn sie nicht mit \n endet (da read einen Exit-Code ungleich Null zurückgibt, wenn EOF auftritt).

Führen Sie das Skript wie folgt aus:

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

....

1142
cppcoder

Ich empfehle Ihnen, das -r-Flag für read zu verwenden, das für Folgendes steht:

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

Ich zitiere von man 1 read.

Eine andere Sache ist, einen Dateinamen als Argument zu nehmen.

Hier ist aktualisierter Code:

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

Mit der folgenden Bash-Vorlage können Sie jeweils einen Wert aus einer Datei lesen und verarbeiten.

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

Viele Leute haben eine überoptimierte Lösung veröffentlicht. Ich denke nicht, dass es falsch ist, aber ich denke demütig, dass eine weniger optimierte Lösung wünschenswert ist, damit jeder leicht verstehen kann, wie das funktioniert. Hier ist mein Vorschlag:

#!/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

Benutzen:

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

Wenn Sie IFS anders eingestellt haben, erhalten Sie ungerade Ergebnisse.

18
user3546841

Wenn Sie sowohl die Eingabedatei als auch die Benutzereingabe (oder etwas anderes von stdin) verarbeiten müssen, verwenden Sie die folgende Lösung:

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

Basierend auf der akzeptierten Antwort und dem Bash-Hackers-Weiterleitungs-Tutorial .

Hier öffnen wir den Dateideskriptor 3 für die als Skriptargument übergebene Datei und weisen read an, diesen Deskriptor als Eingabe (-u 3) zu verwenden. Daher belassen wir den Standardeingabebeschreiber (0) an einem Terminal oder einer anderen Eingabequelle, der die Benutzereingaben lesen kann.

9
gluk47

Für die korrekte Fehlerbehandlung:

#!/bin/bash

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

Mit dem IFS-Tool (Internal Field Separator) in Bash wird das Zeichen definiert, mit dem Zeilen in Token getrennt werden. Standardmäßig wird der Tabulator <>/< Leerzeichen >/< newLine >

Schritt 1 : Laden Sie die Dateidaten und fügen Sie sie in die Liste ein:

# 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>"

Schritt 2 : Jetzt iteriere und drucke die Ausgabe:

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

Echospezifischer Index im Array : Zugriff auf eine Variable im Array:

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

Folgendes wird nur den Inhalt der Datei ausdrucken:

cat $Path/FileName.txt

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