यह चर क्यों नहीं बदला जा रहा है? [डुप्लिकेट] - लिनक्स, बैश

मेरे पास एक बड़ी लिपि है लेकिन यह छोटा एक समस्या दिखाता है:

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
ls | while read L
do
x=5
echo "this is a file $L and this is now set to five --> $x"
done
fi
echo "this should NOT be 0 --> $x"

यदि चर लूप के बाहर सेट किया गया है तो यह काम करता है जैसा कि मैं उम्मीद करता हूं। बैश संस्करण 3.2.25 (1) है - कृपया (x86_64-redhat-linux-gnu)। अगर यह कुछ स्पष्ट बात है तो मैं बहुत मूर्ख महसूस करूंगा।

उत्तर:

जवाब के लिए 3 № 1

The x 5 करने के लिए सेट किया जा रहा है एक उप-शेल में है (क्योंकि यह एक पाइपलाइन का हिस्सा है), और एक उप-शैल में क्या होता है पैरेंट शेल को प्रभावित नहीं करता है ।

आप उप-शेल से बचने और परिणाम में प्रक्रिया प्रतिस्थापन का उपयोग करते हुए आपको अपेक्षित प्राप्त कर सकते हैं bash:

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
while read L
do
x=5
echo "this is a file $L and this is now set to five --> $x"
done < <(ls)
fi
echo "this should NOT be 0 --> $x"

अब while लूप मुख्य शेल प्रक्रिया का भाग है (केवल ls एक उप प्रक्रिया में है) तो चर x प्रभावित होता है ।

हम के उत्पादन को पार्स करने की खूबियों पर चर्चा कर सकते हैं ls एक और समय; इस मुद्दे पर पूछताछ में काफी हद तक हादसा हुआ है ।

एक और विकल्प होगा:

#!/bin/bash
x=0
if [[ $x == 0 ]]
then
ls |
{
while read L
do
x=5
echo "this is a file $L and this is now set to five --> $x"
done
echo "this should NOT be 0 --> $x"
}
fi
echo "this should be 0 still, though --> $x"

संबंधित सवाल
सबसे लोकप्रिय