Die korrekte Notation für Process Substitution lautet:
while read i; do echo $i; done < <(echo "$FILECONTENT")
Der letzte i
in der Schleife zugewiesene Wert ist dann verfügbar, wenn die Schleife endet. Eine Alternative ist:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Die geschweiften Klammern sind eine E / A-Gruppierungsoperation und erstellen selbst keine Unterschale. In diesem Zusammenhang sind sie Teil einer Pipeline und werden daher als Subshell ausgeführt. Dies liegt jedoch an der |
, nicht an der { ... }
. Sie erwähnen dies in der Frage. AFAIK, Sie können innerhalb dieser innerhalb dieser Funktion eine Rückkehr durchführen.
Bash bietet auch das shopt
eingebaute und eine seiner vielen Optionen ist:
lastpipe
Wenn festgelegt und die Jobsteuerung nicht aktiv ist, führt die Shell den letzten Befehl einer Pipeline aus, die in der aktuellen Shell-Umgebung nicht im Hintergrund ausgeführt wird.
Wenn Sie also so etwas in einem Skript verwenden, wird das Modifizierte sum
nach der Schleife verfügbar:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe # Comment this out to see the alternative behaviour
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Wenn Sie dies in der Befehlszeile tun, wird normalerweise die Jobsteuerung nicht aktiv ausgeführt (dh in der Befehlszeile ist die Jobsteuerung aktiv). Das Testen ohne Verwendung eines Skripts ist fehlgeschlagen.
Wie Gareth Rees in seiner Antwort feststellte , können Sie manchmal auch eine Hier-Zeichenfolge verwenden :
while read i; do echo $i; done <<< "$FILECONTENT"
Dies erfordert nicht shopt
; Möglicherweise können Sie einen Prozess damit speichern.