Wie kann ich ein Array aus der ersten Zeile mehrerer Textquellen erstellen?

8

Ich habe eine Reihe von Pfaden zu Dateien, die jeweils mehrere Textzeilen haben. Ich möchte ein Array erstellen, das mit der ersten Zeile jeder Datei gefüllt ist, die wie folgt verarbeitet wird:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Ich habe höchstens einen Wert in meinem Array. Ich kann das gesuchte Array nicht aus der for-Schleife herausholen. Ich habe viele Variationen ausprobiert und es fällt mir schwer herauszufinden, wo ich falsch liege.

dimmech
quelle

Antworten:

11

Du wolltest

lines+=("$line")

+=WORD ist die Verkettung (oder Hinzufügung) von Zeichenfolgen . Eine zusammengesetzte Zuweisung +=(...) hängt die Werte an das Array an.

Sie möchten wahrscheinlich auch alle Ihre Variablenerweiterungen hier zitieren - das wird linedefinitiv benötigt, wenn die Zeile Leerzeichen enthält, aber Sie könnten auch anderswo Probleme haben.

Michael Homer
quelle
Danke, es macht jetzt Sinn, warum es bei einigen meiner Versuche so aussah, als wäre das Ergebnis eine Mischung aus beiden Zeilen.
Dimmech
4

In Bash können Sie Zeilen auch direkt in ein Array einlesen. Wenn Sie die aktuelle Array-Länge ${#lines[@]}als Einfügeindex auswählen , können Sie sie anhängen:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Synopsis-Auszug

mapfile mapfile [-n count] [-O origin] [-t] [array]

Leseleitungen von der Standardeingabe in das indizierte Feldvariable Array [...]. Optionen haben, falls vorhanden, folgende Bedeutung:

  • -n: Kopieren Sie höchstens die Zählzeilen . Wenn count 0 ist, werden alle Zeilen kopiert.

  • -O: Beginnen Sie zum Zuweisen von Array am Index Herkunft . Der Standardindex ist 0.

  • -t: Entfernen Sie eine nachfolgende neue Zeile aus jeder gelesenen Zeile.

David Foerster
quelle