2010-11-21 2 views
3

hier ist also mein Skript:Bash Katze, während lassen und Rohr führen zu seltsamem Scoping Verhalten

count=0 
cat myfile | while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done 
echo $count 

Die letzte Echo-Anweisung ausgegeben 0 statt die Anzahl der Zeilen in der Datei, obwohl die echo-Anweisung in der While-Schleife druckt den Inkrementierungswert.

Das Problem liegt in der Verrohrung, denn mit einer einfachen while-Schleife gibt die letzte echo-Anweisung den richtigen Wert aus. Wie kann ich das zur Arbeit bringen?

Antwort

4

In Bash können Sie Prozess-Substitution und vermeiden die temporäre Datei und die Variablen in der while-Schleife wird beibehalten .

count=0 
while read -r line # you should almost always use -r 
do 
    #some stuff... 
    ((count++)) # alternative form 
    echo $count 
done < <(tac myfile) 
echo $count 
2

Bei der Verwendung von Pipes wird eine neue Subshell erstellt, und alle darin enthaltenen Variablen gehen verloren. Verwenden Sie stattdessen den folgenden Code:

count=0 
while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done < myfile 
echo $count 

Beispiel mit einem Befehl: tac:

count=0 
# Create a random file 
tmpfile=$(mktemp) 
tac myfile > $tmpfile 
while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done < $tmpfile 
# remove temp file 
rm $tmpfile 
echo $count 
+0

Danke, aber ich würde auch gerne die Datei in umgekehrter Reihenfolge mit tac lesen. Kann ich das tun mit ... done subb

+0

Nein, leider nicht. Um dieses Problem zu umgehen, können Sie den Inhalt der Datei in einer temporären Datei ausgeben und den Inhalt daraus lesen. Ich werde meine Antwort mit einem Beispiel aktualisieren. – Lekensteyn

+0

Danke! Daran habe ich nicht gedacht. – subb

Verwandte Themen