Lokale Variablen nach beenden der Schleife
Ich habe einige Probleme mit lokalen Variablen nach verlassen einer Schleife. Die variable max
endet mit dem Wert 0, obwohl der code unten:
max=0
cat tmp|while read line
do
temp=$(echo $line|tr -d "\n"|wc -c)
if [ $temp -gt $max ];then
max=$temp
echo $max
fi
done
echo -n tmp $max
cat tmp
12345
123456
- Und das ist die Ausgabe die ich erhalte:
5
6
tmp 0
Ich verstehe nicht, warum max
ist 0 nach dem verlassen der Schleife, während in der Schleife findet er die richtigen Werte.
- Ich denke, dieser Beitrag befasst sich mit der Frage: linuxforums.org/forum/linux-programming-scripting/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem Rohr startet eine neue subshell, mit seiner eigenen Umgebung und Variablen Raum. Verwenden
< tmp
am Ende der Schleife statt.Gemäß der bash-Manpage der einzelnen Befehle in einer pipeline ausgeführt wird, in einer subshell. Das heißt, dass die while-Schleife läuft in einer subshell, und nur der Wert der Variablen max, der subshell verändert wird.
Variablen an subshells werden nicht weitergegeben, wieder an die aufrufende shell mit dem Befehl echo und so sieht immer noch die erste den Wert null erreicht.
Wenn Sie den echo in der gleichen subshell (man beachte die geschweiften Klammern) wird es funktionieren:
Wenn Sie den Wert für weitere Berechnungen in der äußersten Schale, Sie müssen Sie verwenden, Kommando-substitution, wie diese:
Rohr vor Ihr, während ist alles innerhalb der Schleife in eine separate Schale, und somit eine separate Kennung Kontext (im wesentlichen eine neue Umgebung).
Umleiten der
tmp
- Datei in daswhile
Schleife über<
halten Ihre Schleife und den Variablen, die alle im selben Ausführungskontext.Hier ist ein one-liner in awk.