สัญกรณ์ที่ถูกต้องสำหรับการทดแทนกระบวนการคือ:
while read i; do echo $i; done < <(echo "$FILECONTENT")
ค่าสุดท้ายของi
กำหนดในลูปจะพร้อมใช้งานเมื่อลูปสิ้นสุดลง อีกทางเลือกหนึ่งคือ:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
วงเล็บปีกกาเป็นการดำเนินการจัดกลุ่ม I / O และไม่ได้สร้างซับเชลล์ขึ้นเอง ในบริบทนี้พวกเขาเป็นส่วนหนึ่งของไปป์ไลน์ดังนั้นจึงถูกเรียกใช้เป็น subshell แต่เป็นเพราะ|
ไม่ใช่{ ... }
. คุณพูดถึงสิ่งนี้ในคำถาม AFAIK คุณสามารถทำผลตอบแทนจากภายในฟังก์ชันเหล่านี้ได้
Bash ยังให้บริการในshopt
ตัวและหนึ่งในตัวเลือกมากมายคือ:
lastpipe
หากตั้งค่าไว้และการควบคุมงานไม่แอ็คทีฟเชลล์จะรันคำสั่งสุดท้ายของไปป์ไลน์ที่ไม่ได้ดำเนินการในเบื้องหลังในสภาพแวดล้อมเชลล์ปัจจุบัน
ดังนั้นการใช้สิ่งนี้ในสคริปต์ทำให้ modfied sum
พร้อมใช้งานหลังจากลูป:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
การทำเช่นนี้ที่บรรทัดคำสั่งมักจะเรียกใช้ "job control is not active" (นั่นคือที่บรรทัดคำสั่งการควบคุมงานจะทำงานอยู่) การทดสอบโดยไม่ใช้สคริปต์ล้มเหลว
นอกจากนี้ตามที่Gareth Reesระบุไว้ในคำตอบของเขาบางครั้งคุณสามารถใช้สตริงที่นี่ :
while read i; do echo $i; done <<< "$FILECONTENT"
สิ่งนี้ไม่ต้องการshopt
; คุณอาจสามารถบันทึกกระบวนการโดยใช้มันได้