rklm schrieb:
Es gibt eine Sektion "SHELL BUILTIN COMMANDS". Da finden sich alle. Du kannst die Referenz auch online lesen; da ist die Struktur vielleicht etwas einfacher zu finden.
Das Lustige ist ja, dass ich inzwischen eine Methode gefunden habe, die builtin commands recht einfach zu finden.
Das finde ich eine seltsame Formulierung, die m.E. nicht ganz richtig ist. read
und readarray
haben zwei ähnliche aber doch deutlich unterschiedliche Aufgaben: read
liest eine Zeile, die in Wörter geteilt wird und die entweder auf angegebene einzelne Variablen oder ein Array (mit Option -a) verteilt wird. readarray
bzw. mapfile
hingegen ist dafür gedacht eine komplette Datei (oder Teile davon, jedenfalls mehrere Zeilen) einzulesen und alle gelesenen Zeilen in ein Array zu speichern.
Ja, auch diesen Irrtum habe ich in den nachfolgenden Experimenten festgestellt (es sah halt auf den ersten Blick so aus). Genau wie ich inzwischen den grundlegenden Irrtum, der mich überhaupt erst zu dieser Frage veranlasst hat, herausgefunden habe. Weiter oben schrieb ich ja bereits schon einmal:
wxpte schrieb:
Dass newline bei Linux ein ganz normales Zeichen (wie jedes andere auch) ist, wird mich wohl ewig verwirren. 🥴
Tatsächlich komme ich zeitweise immer wieder zu der falschen Annahme, readarray
bestünde aus zwei Ebenen:
Eine Ebene, auf der mit Hilfe des newline
mehrere Arrays voneinander getrennt werden
Eine Ebene, auf der mit einem anderen, frei wählbaren Trenner (default: space
) die Arrayfelder voneinander getrennt werden
In Wirklichkeit ist es wohl aber so, dass readarray
und read
aus dem Datenstrom lesen und jeweils nur einen Trenner zur Aufteilung zur Verfügung haben.
Deswegen funktioniert das im Eingangspost zuerst gelistete Skript ja auch: read
liest wegen des default-Trenners newline
zeilenweise ein (wobei man interessanderweise auch hier den Trenner mit der Option -d ändern kann), und while
baut aus jeder Einheit einen Schleifendurchgang. Dann wird im nächsten Schritt mit readarray
die nur aus der jeweiligen Zeile bestehende Variable eingelesen, so dass am Ende ein sauberes Array herauskommt.
Wenn man also zwei Ebenen haben will, gibt es wohl keine Alternative im Shell-Skripting, als read
und readarray
in der Schleife zu verschachteln. Nachdem ich das erst einmal herausgefunden habe, löste sich viel von meinem illusionären Verständnis auf.
rklm schrieb:
Das ist falsch. Option -t bewirkt, dass die Trennzeichen nicht im Array gespeichert werden. Sie werden also nicht "bei der Ausgabe des gesamten Arrays unterdrückt". Das wäre auch sehr unlogisch, wenn eine Option von readarray
Auswirkungen auf irgendein folgendes echo
hätte.
Auch das hat sich in meinen Übungen inzwischen deutlich bestätigt. Denn wenn ich mit einer csv-Datei nach der Zerlegung in Arrays etwas anderes mache, als ein schnödes echo
, dann bekomme ich jede Menge Fehlermeldungen, dass der Befehl unbekannt sei, um die Ohren gehauen. Offensichtlich interpretiert bash die in den Arrayfeldern enthaltenen Semikola dann als Trenner zwischen Befehlen. Die Verwendung der Option -t ist daher unentbehrlich.
Alles in allem hat mir dieser Durchgang nicht nur einige neue Erkenntnisse verschafft, sondern auch irgendwie Spaß gemacht. 😊
Also: nochmals vielen Dank an alle für die Unterstützung.