Skip to content

Wie man Eingaben an eine Bash-While-Schleife weiterleitet und Variablen nach Schleifenende erhält

Lösung:

Die korrekte Schreibweise für Prozesssubstitution lautet:

while read i; do echo $i; done < <(echo "$FILECONTENT")

Der letzte Wert von i die in der Schleife zugewiesen wurde, 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 Untershell. In diesem Zusammenhang sind sie Teil einer Pipeline und werden daher als Subshell ausgeführt, aber es liegt an der |, nicht der { ... }. Das erwähnst du in der Frage. AFAIK können Sie aus diesen innerhalb einer Funktion eine Rückgabe durchführen.


Bash bietet auch die shopt eingebaut und eine seiner vielen Optionen ist:

lastpipe

Wenn gesetzt und die Jobsteuerung nicht aktiv ist, führt die Shell den letzten Befehl einer Pipeline aus, der nicht im Hintergrund in der aktuellen Shell-Umgebung ausgeführt wird.

Also, mit so etwas in einem Skript macht das modifizierte sum verfügbar nach der Schleife:

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

Dies über die Befehlszeile zu tun, führt normalerweise zu einem Verstoß gegen 'Auftragssteuerung ist nicht aktiv' (d. h. auf der Befehlszeile ist die Auftragssteuerung aktiv). Das Testen ohne Verwendung eines Skripts ist fehlgeschlagen.

Wie Gareth Rees in seiner Antwort feststellt, können Sie auch manchmal eine Here-Zeichenfolge verwenden:

while read i; do echo $i; done <<< "$FILECONTENT"

Dies erfordert nicht shopt; Sie können möglicherweise einen Vorgang damit speichern.

Jonathan Leffler erklärt, wie man mit dem macht, was man will Prozesssubstitution, aber eine andere Möglichkeit ist die Verwendung von a hier Schnur:

while read i; do echo "$i"; done <<<"$FILECONTENT"

Dies spart einen Vorgang.

Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.