La notazione corretta per la sostituzione del processo è:
while read i; do echo $i; done < <(echo "$FILECONTENT")
L'ultimo valore di i
assegnato 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 shopt
builtin 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 sum
disponibile 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.