वैरिएबल में संग्रहीत कई-लाइन स्ट्रिंग पर इरेटिंग


17

मैंने पढ़ा कि चीजों को लिखना बुरा है for line in $(command), इसके बजाय सही तरीका लगता है:

command | while IFS= read -r line; do echo $line; done

यह बहुत अच्छा काम करता है। लेकिन क्या होगा अगर मैं जिस पर चलना चाहता हूं वह चर की सामग्री है , कमांड का प्रत्यक्ष परिणाम नहीं है?

उदाहरण के लिए, कल्पना करें कि आप निम्न फ़ाइल बनाते हैं quickfox:

The quick brown
foxjumps\ over -
the
lazy ,
dog.

मैं ऐसा कुछ करने में सक्षम होना चाहूंगा:

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect

जवाबों:


19

बैश और ज़श जैसे आधुनिक गोले में, आपके पास बहुत उपयोगी `<<< 'पुनर्निर्देशक है जो एक स्ट्रिंग को इनपुट के रूप में स्वीकार करता है। तो आप करेंगे

while IFS= read -r line ; do echo $line; done <<< "$variable"

अन्यथा, आप हमेशा कर सकते हैं

echo "$variable" | while IFS= read -r line ; do echo $line; done

क्षमा करें, मुझे पाठ्यक्रम की सामग्री को प्रतिध्वनित करने के बारे में सोचना चाहिए था। लेकिन वैसे भी जल्दी जवाब के लिए धन्यवाद!
शैलजोह

1
$variableजब आप इसका उपयोग करते हैं, तो आपको दोहरे-उद्धरण की आवश्यकता होती है, अन्यथा whileलूप को केवल एक पंक्ति में इनपुट मिलेगा। उदाहरण के लिए, echo $variableबनाम echo "$variable"या cat <<< $variableबनाम के बीच आउटपुट का अंतर देखें cat <<< "$variable"
कास

@ कैस दरअसल यह इस बात पर निर्भर करता है कि $ चर के अंदर क्या है। ओपी द्वारा प्रस्तुत मामले में ("चर = $ (बिल्ली quickfox)") यह अतिरिक्त उद्धरण के बिना काम करता है। लेकिन सामान्य मामले के लिए, आप सही हैं। मैं अपना उत्तर संपादित करता हूं। धन्यवाद।
लैजगॉर्ट

variable=$(cat quickfox)ओपी के सवाल में ही मैं क्या बात कर रहा था का एक उदाहरण प्रदान करता है। $variableदोहरे उद्धरण चिह्नों के अंदर का उपयोग करते हुए इसमें शामिल हैं। यदि आप लाइन-बाय-लाइन पढ़ और प्रसंस्करण कर रहे हैं, तो इससे बहुत अंतर पड़ता है - पूर्व के साथ आपके पास कई इनपुट लाइनें हैं, बाद वाले के साथ आपके पास सिर्फ एक इनपुट लाइन है। इनपुट डेटा सतही रूप से समान है, लेकिन व्यवहार में, उन दो मामलों में पूरी तरह से अलग है।
कास

उदाहरण के लिए: उस इनपुट डेटा के साथ, cat <<< "$variable" | wc -lरिटर्न 5. cat <<< $variable | wc -lरिटर्न 1. यदि आप किसी चर में व्हाट्सएप (newlines, tabs, सिंगल या मल्टीपल स्पेस सहित) को संरक्षित करने की आवश्यकता / चाहते हैं तो आप वेरिएबल का उपयोग करते समय डबल-उद्धरण अवश्य करें, अन्यथा वे सभी प्रत्येक "शब्द" के बीच एक ही स्थान में बदल जाएंगे।
कास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.