La notazione corretta per la sostituzione del processo è:
while read i; do echo $i; done < <(echo "$FILECONTENT")
L'ultimo valore di iassegnato nel ciclo è quindi disponibile quando il ciclo termina. Un'alternativa è:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Le parentesi graffe sono un'operazione di raggruppamento I / O e non creano esse stesse una subshell. In questo contesto, fanno parte di una pipeline e vengono quindi eseguiti come una subshell, ma è a causa di |, non di { ... }. Lo dici nella domanda. Per quanto ne so, puoi fare un ritorno da dentro questi dentro una funzione.
Bash fornisce anche il shoptbuiltin e una delle sue numerose opzioni è:
lastpipe
Se impostato e il controllo del lavoro non è attivo, la shell esegue l'ultimo comando di una pipeline non eseguita in background nell'ambiente shell corrente.
Pertanto, l'utilizzo di qualcosa di simile in uno script rende sumdisponibile la modifica dopo il 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
Farlo dalla riga di comando di solito viene eseguito in modo negativo con "il controllo del lavoro non è attivo" (ovvero, alla riga di comando, il controllo del lavoro è attivo). Il test senza utilizzare uno script non è riuscito.
Inoltre, come notato da Gareth Rees nella sua risposta , a volte puoi usare una stringa qui :
while read i; do echo $i; done <<< "$FILECONTENT"
Questo non richiede shopt; potresti essere in grado di salvare un processo utilizzandolo.