Könnte jemand erklären, wie der folgende Code funktioniert?
echo '1 2 3 4 5 6' | while read a b c
do
echo $c $b $a
done
Insbesondere möchte ich wissen, warum die Ausgabe dieser Schleife 3 4 5 6 2 1
statt 3 2 1
und 6 5 4
in zwei separaten Zeilen erfolgt? Ich kann mich nicht darum kümmern ...
Wenn Sie die Schleife auf diese Weise umschreiben, sehen Sie, was gerade passiert:
Dies ergibt als Ausgabe:
Beachten Sie zuerst, dass nur ein einziger Echobefehl ausgeführt wird. Wenn es mehrmals ausgeführt würde, würden Sie unter anderem die
(iteration beginning)
und(iteration ending)
Teilzeichenfolgen mehrmals gedruckt sehen.Dies bedeutet, dass eine
while
Schleife hier nicht wirklich etwas bewirkt. Dieread
eingebaute Funktion liest durch Leerzeichen getrennten Text 1 in jede angegebene Variable. Zusätzliche Eingaben werden an das Ende der zuletzt angegebenen Variablen angehängt. 2 Also Variablena
undb
nehmen die Werte1
bzw.2
an, währendc
den Wert annimmt3 4 5 6
.Wenn die Schleifenbedingung (
while read a b c
) zum zweiten Mal ausgewertet wird, ist keine Eingabe mehr von der Pipe verfügbar (wir haben nur eine einzige Textzeile weitergeleitet), sodass derread
Befehl mit false anstelle von true ausgewertet wird und die Schleife angehalten wird (bevor die Pipe ausgeführt wird) Körper ein zweites Mal).1 : Um technisch und spezifisch zu sein, liest das
read
eingebaute Element , wenn Variablennamen als Argumente übergeben werden, die Eingabe und teilt sie in separate "Wörter" auf, wenn es auf IFS-Leerzeichen stößt (siehe auch diese Frage und diesen Artikel ).2 :
read
‚s Verhalten keine zusätzlichen Bereichen Eingabe in die letzte Variable von Jamming spezifiziert viele scripters nicht intuitiv ist, auf den ersten. Es wird verständlicher, wenn man bedenkt, dass Florian Dieschs Antwort besagt ,read
dass er immer versucht, eine ganze Zeile zu lesen - und dasread
soll sowohl mit als auch ohne Schleife verwendbar sein.quelle
while
dies in diesem Beispiel nicht dem normalen Zweck entsprach, aber dannread
warf mich der Befehl ab ... Irgendwie interpretierte ich es als "whileread a b c
is not false, doecho ...
". Vielen Dank für die Erklärung, wie es wirklich funktioniert hat. Ich bin gestern auf diesen Code gestoßen und wusste, dass er michread a b c
ausgewertet wahr, und die Schleifenbedingung (read a b c
) läuft mehr als einmal. Bit wertet es nur das 1. Mal wahr aus . Das zweite Mal, gibt es keine Eingabe mehr aus der Leitung zu lesen, so das Ende der Datei angetroffen wird, verursachtread
zurückzukehren falsch . (Weiterehelp read
Informationen finden Sie im letzten Abschnitt der Ausgabe von "Exit Status". In Shell-Skripten bedeutet Null Wahr und Nicht-Null Falsch.) Wenn Sie mehr als eine Eingabezeile weiterleiten,while read ...
wird der Schleifenkörper verwendet mehrmals ausgeführt werden.