Variables Inkrementieren in bash

8

Betrachten Sie das folgende Skript:

%Vor%

Normalerweise sollte es zeilenweise die Datei lesen, das Ergebnis in einem Array speichern, dann durch das Array gehen und Zeile für Zeile ausgeben. Das Problem ist, dass die Variable $ num nach dem Beenden der ersten Schleife irgendwie zurückgesetzt wird. Die Ausgabe dieses Skripts für mich ist die folgende (mit einer Datei mit einigen zufälligen Müll darin):

%Vor%

Warum ist das? Wie erreiche ich, mich an die Variable zu erinnern? Ich benutze Bash 3.1.17 auf SUSE Linux 10.

    
petersohn 20.09.2011, 08:54
quelle

3 Antworten

14

Warum? Es ist weil das:

%Vor%

führt die while -Anweisung in einem separaten Prozess mit einer eigenen Umgebung aus, die die übergeordnete Umgebung nicht berührt. Sie werden ebenso feststellen, dass das Array lines auch nicht vorhanden ist.

Das folgende vereinfachte Skript zeigt dies in Aktion:

%Vor%

Die Ausgabe dieses Skripts lautet:

%Vor%

, weil die Einstellung der Variable auf 999 im Unterprozess erfolgt.

Wenn Sie möchten, dass Informationen im aktuellen Prozess (dem Skript) widergespiegelt werden, müssen Sie das Skript in ausführen oder eine andere Möglichkeit finden, die Informationen herauszuholen des Unterprozesses.

Wenn Sie die Eingabeumleitung verwenden und keine Unterprozess-Pipeline starten, sollte sie wie gewünscht funktionieren. Das liegt daran, dass das while -Bit dann im Kontext des aktuellen Prozesses statt als separater Prozess in einer Pipeline ausgeführt wird. Zum Beispiel:

%Vor%

erzeugt:

%Vor%

Ersetzen Sie für Ihren speziellen Fall:

%Vor%

mit:

%Vor%     
paxdiablo 20.09.2011, 08:56
quelle
3

Um zur vorherigen Antwort hinzuzufügen: und um das (und die UUOC) zu vermeiden, benötigen Sie etwas wie folgt:

%Vor%     
Dimitre Radoulov 20.09.2011 08:59
quelle
0

Bewahren Sie Ihre Variablen einfach in derselben Umgebung auf. In Zeile 4 entfernen Sie "cat file |". In Zeile 9 fügen Sie "& lt; Datei" hinzu. Ihre Endnummer enthält jetzt die erwartete 11, und das Zeilenarray wird über die zweite Schleife jeweils ein Element ausgeben.

    
Daniel Liston 14.08.2013 02:03
quelle

Tags und Links