La notation correcte pour la substitution de processus est:
while read i; do echo $i; done < <(echo "$FILECONTENT")
La dernière valeur i
affectée dans la boucle est alors disponible lorsque la boucle se termine. Une alternative est:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Les accolades sont une opération de regroupement d'E / S et ne créent pas elles-mêmes un sous-shell. Dans ce contexte, ils font partie d'un pipeline et sont donc exécutés en tant que sous-shell, mais c'est à cause du |
, pas du { ... }
. Vous le mentionnez dans la question. AFAIK, vous pouvez faire un retour à partir de ces derniers à l'intérieur d'une fonction.
Bash fournit également le shopt
intégré et l'une de ses nombreuses options est:
lastpipe
S'il est défini et que le contrôle des travaux n'est pas actif, le shell exécute la dernière commande d'un pipeline non exécuté en arrière-plan dans l'environnement de shell actuel.
Ainsi, utiliser quelque chose comme ça dans un script rend le modfié sum
disponible après la boucle:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Faire cela sur la ligne de commande exécute généralement une faute de «le contrôle des travaux n'est pas actif» (c'est-à-dire que sur la ligne de commande, le contrôle des travaux est actif). Le test sans utiliser de script a échoué.
De plus, comme l'a noté Gareth Rees dans sa réponse , vous pouvez parfois utiliser une chaîne ici :
while read i; do echo $i; done <<< "$FILECONTENT"
Cela ne nécessite pas shopt
; vous pourrez peut-être enregistrer un processus en l'utilisant.