प्रक्रिया प्रतिस्थापन के लिए सही अंकन है:
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 ग्रुपिंग ऑपरेशन हैं और खुद को एक सबहेल्ड नहीं बनाते हैं। इस संदर्भ में, वे एक पाइपलाइन का हिस्सा हैं और इसलिए एक उपधारा के रूप में चलाए जाते हैं, लेकिन इसका कारण है |
, नहीं { ... }
। आप इस प्रश्न में उल्लेख करते हैं। AFAIK, आप एक फ़ंक्शन के अंदर इन से वापसी कर सकते हैं।
बैश भी shopt
बिलिन प्रदान करता है और इसके कई विकल्पों में से एक है:
lastpipe
यदि सेट किया गया है, और नौकरी नियंत्रण सक्रिय नहीं है, तो शेल मौजूदा शेल वातावरण में पृष्ठभूमि में निष्पादित नहीं की गई पाइपलाइन की अंतिम कमांड चलाता है।
इस प्रकार, स्क्रिप्ट में कुछ इस तरह का उपयोग करना 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
कमांड लाइन पर ऐसा करने से आमतौर पर 'जॉब कंट्रोल एक्टिव नहीं होता है' की बेईमानी चलती है (यानी कमांड लाइन पर जॉब कंट्रोल एक्टिव होता है)। स्क्रिप्ट का उपयोग किए बिना यह परीक्षण विफल रहा।
इसके अलावा, गैरेथ रीस ने अपने जवाब में कहा , आप कभी-कभी यहां स्ट्रिंग का उपयोग कर सकते हैं :
while read i; do echo $i; done <<< "$FILECONTENT"
इसके लिए आवश्यकता नहीं है shopt
; आप इसका उपयोग करके एक प्रक्रिया को बचाने में सक्षम हो सकते हैं।