İşlem Değiştirme için doğru gösterim şöyledir:
while read i; do echo $i; done < <(echo "$FILECONTENT")
i
Döngüde atanan son değer daha sonra döngü sona erdiğinde kullanılabilir. Bir alternatif şudur:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Küme parantezleri bir G / Ç gruplama işlemidir ve kendileri bir alt kabuk oluşturmazlar. Bu bağlamda, bir boru hattının bir parçasıdır ve bu nedenle bir kabuktaki olarak işletilmektedir, ama bunun nedeni biridir |
, değil { ... }
. Soruda bundan bahsediyorsun. AFAIK, bunların içinden bir işlevin içinden bir dönüş yapabilirsiniz.
Bash ayrıca shopt
yerleşik sağlar ve birçok seçeneğinden biri şudur:
lastpipe
Ayarlanırsa ve iş kontrolü etkin değilse, kabuk geçerli kabuk ortamında arka planda yürütülmeyen bir ardışık düzenin son komutunu çalıştırır.
Böylece, bir komut dosyasında buna benzer bir şey kullanmak , değiştirileni döngüden sum
sonra kullanılabilir hale getirir :
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Bunu komut satırında yapmak genellikle 'iş kontrolü etkin değil' hatası verir (yani komut satırında, iş kontrolü etkindir). Bunu bir komut dosyası kullanmadan test etmek başarısız oldu.
Tarafından da belirtildiği gibi, Gareth Rees yaptığı içinde cevap , bazen kullanabilirsiniz burada dize :
while read i; do echo $i; done <<< "$FILECONTENT"
Bu gerektirmez shopt
; onu kullanarak bir işlemi kaydedebilirsiniz.