2 Stimmen

Bereich der globalen Variable im Shell-Skript

Ich habe ein Shell-Skript wie dieses, ich lese eine Datei ein und zähle die Zeilennummer. Ich habe Protokolle wie 1,2,3,4.. usw. aus der Funktion processNumber erhalten

#!/bin/bash

number=0;
processNumber () {
    ((number++));
    echo "$number";
}

grep -E '*' readme.txt | while read -r line ; do
    processNumber "$line";
done;
echo "Und schließlich $number";

Aber es protokolliert "Und schließlich 0" , aber ich erwartete die letzte Zeilennummer. Warum ist das so? Liegt es daran, dass gres einen Datei asynchron liest und echo daher ein Rückruf dazu sein muss?

Oder werden globale Variableänderungen außerhalb der Funktion nicht verfolgt?

Wie kann man das beheben, ohne den grep und Pipe zu ändern?

HINWEIS: Mein Ziel ist es nicht, die Anzahl der Zeilen in der Datei zu finden, sondern dies zu verstehen

4voto

anubhava Punkte 713155

Aber es protokolliert "Und schließlich 0"

Das liegt daran, dass Sie die Funktion processNumber mit einem Pipe aufrufen, was bewirkt, dass sie in einer Unter-Shell ausgeführt wird und nicht in der Haupt-Shell, wodurch die Variable in der Eltern-Shell unverändert auf 0 bleibt.

UPDATE: Um das Erstellen einer Pipe (und einer Unter-Shell) zu vermeiden, verwenden Sie eine for-Schleife wie diese:

while read -r line; do
    processNumber "$line"
done < readme.txt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X