2016-06-29 9 views
0

Ich schreibe ein Bash-Skript, das eine while Schleife verwendet, um über die Zeilen von einem bestimmten Befehl ausgegeben verarbeiten. Ich inkrementiere auch eine Variable (1) für jede gefundene Zeile.Variable inkrementiert in bash while-Schleife auf 0 zurückgesetzt, wenn Schleife beendet

Heres ein Beispiel für den Abschnitt des Skripts in Frage:

#!/bin/bash 

count=0 

ls | while read f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done 

echo "Found total of ${count} rows" 

Im Grunde ist es erhöht die $count Variable ganz gut, aber dann, wenn ich drucke $count nach der while-Schleife .. sein auf 0 zurückgesetzt. .

Beispiel Ausgabe:

Count is at 1 
Count is at 2 
Count is at 3 
Count is at 4 
Count is at 5 
Found total of 0 rows 

Jede Idee, warum die $count nachdem die Schleifen fertig zurückgesetzt würde?

count=0 

ls | while read f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done && echo "Found total of ${count} rows" 

ohne Erfolg: Mit dem && Operator auf der Schleife, wie so

ich auch versucht, die letzte Echo-Anweisung hinzufügen.

+0

Analysieren Sie nicht die Ausgabe von 'ls' in jedem Fall; Verwende 'für f in *; Tu es stattdessen. – chepner

Antwort

2

Rohr laicht ein subshell Jede Hilfe würde geschätzt, sondern ein process substitutions verwenden:

while read -r f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done < <(ls) 

Beachten Sie auch, dass Sie sollten nicht parse the output of ls.

Und Ihr Beispiel scheint Anzahl von Dateien und Verzeichnissen im aktuellen Verzeichnis zu zählen, die mit Suchen und WC getan werden können:

find -maxdepth 1 -mindepth 1 -printf "\n" | wc -l 

oder Sie können ls mit einem for-Schleife vermeiden und Globbing:

for f in * .*; do 
    [ -e "$f" ] || continue 
    count=$((count + 1)) 
    echo "Count is at ${count}" 
done 
+0

Beachten Sie, dass beide Ihrer Alternativen versteckte Dateien enthalten, was die 'ls'-Parsing-Version nicht tut. –

+0

Dein erstes Snippet mit dem '<<()' hat super funktioniert! Danke. Kannst du mir sagen, warum ich das tun musste? und es würde einfach nicht funktionieren. – Justin

+0

@Justin las die erste verlinkte Seite in der Antwort :-) – andlrc

Verwandte Themen