
Ich habe mehrere Artikel gelesen, in denen beschrieben wird, wie man ein Bash-Array füllt, bei dem jeder Eintrag Leerzeichen enthält. Ich glaube, bei mir hat es geklappt.
Ich muss dies in einer Schleife tun und bei jeder Iteration ein größeres Array mit dem Inhalt aller Arrays füllen.
Ich habe also eine äußere Schleife, die die Einträge eines Arrays durchläuft, das ich von einem anderen Skript erhalten habe. In jeder Iteration dieser Schleife führe ich eine Befehlszeile aus, die mehrere Ausgabezeilen erzeugt, und ich möchte, dass jede Zeile ein Array-Eintrag ist. Ich muss alle diese Array-Einträge zum „Summary“-Array hinzufügen. Da ich keine Möglichkeit kenne, einfach „den Inhalt dieses Arrays an ein anderes Array anzuhängen“, gehe ich davon aus, dass ich das kleinere Array durchlaufen muss. Bis jetzt funktioniert das, was ich brauche. Das Anhängen an das größere Array scheint jedoch nicht richtig zu funktionieren. Nachdem ich das Anhängen an das größere Array ausgeführt und die Länge des größeren Arrays überprüft habe, ist sie immer nur „1“.
Der relevante Teil des Skripts lautet ungefähr wie folgt:
nslist=$(...)
pnarray=()
for ns in $nslist; do
IFS=$'\n' nspnarray=($(...))
echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
for pn in ${nspnarray[@]}; do
echo "pn[$pn]" # This looks fine
IFS=$'\n' pnarray+=$pn # Something wrong with this?
echo "pnarray.len[${#pnarray[@]}]" # is always 1
done
done
Dies ist kein vollständiges Skript, daher hoffe ich, dass es klar ist. Die Zeilen mit „Das sieht gut aus“-Kommentaren geben das aus, was ich will. In meinen Beispieldaten erzeugt die Befehlszeile, die ich in der „nspnarray“-Zuweisung aufrufe, fünf Ausgabezeilen, und die Druckanweisung „nspnarray.len“ zeigt „5“ an.
Dann iteriere ich durch alle fünf Einträge und drucke jeden einzelnen aus. Das sieht immer noch gut aus. Es wird ein Wert mit Leerzeichen ausgegeben, wie erwartet. Dann versuche ich, das meinem „summary“-Array zuzuweisen, und drucke dann die Länge des Summary-Arrays aus, das immer „1“ ausgibt. Ich gehe davon aus, dass ich bei der Zuweisung in der Zeile „Stimmt etwas nicht damit?“ etwas falsch mache.
Antwort1
Das Hinzufügen eines Arrays zu einem anderen Array ist ziemlich unkompliziert:
$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")
Wenn Sie allerdings relativ komplizierte Dinge mit Arrays machen, sollten Sie wirklich eine für diese Aufgabe besser geeignete Sprache verwenden. awk
oder perl
, zum Beispiel. Oder python
. Oder so ziemlich alles außer Bash oder anderen Shells.
Eine Shell eignet sich gut zum Orchestrieren der Ausführung anderer Programme (und Pipelines anderer Programme sowie Umleitungen von stdin und stdout usw.), um Dinge zu erledigen oder Daten zu verarbeiten. Sie ist nicht gut darin, diese anderen Aufgaben selbst zu erledigen – tatsächlich ist sie darin furchtbar.
awk
hat mehrdimensionale Arrays (sowohl indizierte als auch assoziative), perl
tut dies auch und hat auch Datenstrukturen, in denen Arrays oder Hashes andere Arrays und/oder Hashes enthalten können, die beliebig tief verschachtelt sind. Die meisten anderen Sprachen haben auch komplexe Datenstrukturen.
Und, was ebenso wichtig ist: Sie haben nicht die Probleme mit Anführungszeichen oder Worttrennung wie Shells.