La notation correcte pour la substitution de processus est :
while read i; do echo $i; done < <(echo "$FILECONTENT")
La dernière valeur de i
assignée dans la boucle est alors disponible lorsque la boucle se termine. Une alternative est :
echo $FILECONTENT |
{
while read i; do echo $i; done
...faire d'autres choses en utilisant $i ici...
}
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 comme un sous-shell, mais c'est à cause du |
, et non des { ... }
. Vous mentionnez cela dans la question. AFAIK, vous pouvez faire un retour à l'intérieur de ceux-ci à l'intérieur d'une fonction.
Bash fournit également le shopt
intégré et l'une de ses nombreuses options est :
lastpipe
Si activé, et que le contrôle des tâches n'est pas actif, le shell exécute la dernière commande d'un pipeline non exécutée en arrière-plan dans l'environnement shell actuel.
Ainsi, l'utilisation de quelque chose comme ceci dans un script rend le sum
modifié disponible après la boucle :
FILECONTENT="12 Nom
13 Nombre
14 Information"
shopt -s lastpipe # Commentez ceci pour voir le comportement alternatif
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Faire cela en ligne de commande tombe généralement sous le coup de "job control is not active" (c'est-à-dire, en ligne de commande, le contrôle des tâches est actif). Tester ceci sans utiliser de script a échoué.
Aussi, 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 pouvez peut-être économiser un processus en l'utilisant.