Wenn Sie die Schleife auf diese Weise umschreiben, sehen Sie, was gerade passiert:
echo '1 2 3 4 5 6' | while read a b c
do
echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
done
Dies ergibt als Ausgabe:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
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. Die read
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 Variablen a
und b
nehmen die Werte 1
bzw. 2
an, während c
den Wert annimmt 3 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 der read
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 das read
soll sowohl mit als auch ohne Schleife verwendbar sein.