Prawidłowy zapis zastępowania procesu to:
while read i; do echo $i; done < <(echo "$FILECONTENT")
Ostatnia wartość i
przypisana w pętli jest wtedy dostępna po zakończeniu pętli. Alternatywą jest:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Nawiasy klamrowe są operacją grupowania we / wy i same nie tworzą podpowłoki. W tym kontekście są one częścią potoku i dlatego są uruchamiane jako podpowłoka, ale dzieje się tak z powodu |
, a nie { ... }
. Wspomniałeś o tym w pytaniu. AFAIK, możesz wykonać zwrot z tych elementów wewnątrz funkcji.
Bash zapewnia również shopt
wbudowaną, a jedną z wielu opcji jest:
lastpipe
Jeśli jest ustawiona, a kontrola zadań nie jest aktywna, powłoka uruchamia ostatnie polecenie potoku niewykonanego w tle w bieżącym środowisku powłoki.
Dlatego użycie czegoś takiego w skrypcie sprawia, że zmodyfikowany plik jest sum
dostępny po pętli:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Robienie tego w wierszu poleceń zwykle powoduje błąd „kontrola zadań nie jest aktywna” (to znaczy w wierszu poleceń kontrola zadań jest aktywna). Testowanie tego bez użycia skryptu nie powiodło się.
Ponadto, jak zauważył Gareth Rees w swojej odpowiedzi , czasami możesz użyć tutaj ciągu :
while read i; do echo $i; done <<< "$FILECONTENT"
To nie wymaga shopt
; możesz być w stanie zapisać proces za jego pomocą.