La notación correcta para la sustitución de procesos es:
while read i; do echo $i; done < <(echo "$FILECONTENT")
El último valor de i
asignado en el bucle está disponible cuando el bucle termina. Una alternativa es:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Las llaves son una operación de agrupación de E / S y no crean por sí mismas una subcapa. En este contexto, son parte de una canalización y, por lo tanto, se ejecutan como una subcapa, pero se debe a |
, no a { ... }
. Mencionas esto en la pregunta. AFAIK, puede hacer un retorno desde dentro de estos dentro de una función.
Bash también proporciona la función shopt
incorporada y una de sus muchas opciones es:
lastpipe
Si se establece y el control del trabajo no está activo, el shell ejecuta el último comando de una canalización no ejecutado en segundo plano en el entorno de shell actual.
Por lo tanto, usar algo como esto en un script hace que el modificado sum
esté disponible después del ciclo:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Hacer esto en la línea de comando generalmente implica una falta de 'control de trabajo no está activo' (es decir, en la línea de comando, el control de trabajo está activo). No se pudo probar esto sin usar un script.
Además, como señaló Gareth Rees en su respuesta , a veces puede usar una cadena aquí :
while read i; do echo $i; done <<< "$FILECONTENT"
Esto no requiere shopt
; es posible que pueda guardar un proceso usándolo.