समस्या पाइप है, लूप नहीं। इसे इस तरह से आजमाएं
let i=0
declare -a arr
while read -r line ; do
arr=(${line})
let i=i+1
_constr+="${arr[2]} "
done < <(dpkg --list |grep linux-image |grep "ii ")
echo $i
echo ${_constr}
आपको ऊपर दिखाए गए अनुसार स्पष्टता के लिए ग्लोबल्स को पूर्व घोषित करना चाहिए।
पाइप्स को सबहेल में निष्पादित किया जाता है, जैसा कि उनकी टिप्पणी में ब्लैगोवेस्ट ने उल्लेख किया था। process substitution instead का उपयोग करना (यह < <(commands)
वाक्यविन्यास है) सब कुछ एक ही प्रक्रिया में रखता है, इसलिए वैश्विक चर में परिवर्तन संभव है।
संयोग से, अपने पाइप लाइन के साथ-साथ grep
की
dpkg --list |grep '^ii.*linux-image'
एक कम मंगलाचरण के बारे में चिंता करने के लिए सुधार किया जा सकता।
ध्यान रखें कि 'while' लूप एक अलग प्रक्रिया में चलता है, यही कारण है कि आप बदले गए चर नहीं देखते हैं। –
प्रक्रिया प्रतिस्थापन का उपयोग करें? –