एक लिनक्स स्क्रिप्ट में "पढ़ते समय ..." का उपयोग करना


34

क्या कोई बता सकता है कि निम्नलिखित कोड कैसे काम करता है?

echo '1 2 3 4 5 6' | while read a b c
do
  echo $c $b $a
done

विशेष रूप से, मुझे पता है कि क्यों इस लूप के उत्पादन होता है करना चाहते हैं 3 4 5 6 2 1, के बजाय 3 2 1और 6 5 4दो अलग-अलग लाइनों पर? मैं अपने मन को इसके चारों ओर लपेट नहीं सकता ...

जवाबों:


41

readमानक इनपुट से पूरी पंक्ति पढ़ता है, रेखा को फ़ील्ड में विभाजित करता है और इस फ़ील्ड को दिए गए चर में असाइन करता है। यदि चर की तुलना में अधिक टुकड़े हैं, तो शेष टुकड़ों को अंतिम चर को सौंपा गया है।

आपके मामले $aमें 1, $bसौंपा गया है 2और $cशेष है 3 4 5 6


धन्यवाद फ्लोरियन! अब यह समझ में आता है ... किसी कारण से मैंने सोचा था कि रिक्त स्थान प्रत्येक चर पढ़ने को परिसीमित करेंगे, लेकिन स्पष्ट रूप से नहीं। तुम्हारी सहायता सराहनीय है!!
linuxgringo

24

इस तरह से लूप को फिर से देखने से पता चलता है कि क्या हो रहा है:

echo '1 2 3 4 5 6' | while read a b c
  do
    echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
  done

यह आउटपुट के रूप में देता है:

(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)

पहले ध्यान दें कि केवल एक ही इको कमांड चलाया जाता है। यदि इसे एक से अधिक बार चलाया गया, तो आप अन्य चीजों के अलावा, (iteration beginning)और (iteration ending)सबस्ट्रिंग को एक से अधिक बार मुद्रित कर सकते हैं।

यह कहना है कि whileयहाँ एक लूप होना वास्तव में कुछ भी पूरा नहीं कर रहा है। readBuiltin खाली स्थान के अलग पाठ पढ़ता 1 प्रत्येक निर्दिष्ट चर में। निर्दिष्ट अंतिम चर के अंत में अतिरिक्त इनपुट जुड़ जाता है। 2 इस प्रकार चर aऔर bमूल्यों पर 1और 2क्रमशः लेते हैं, जबकि cमूल्य पर ले जाता है 3 4 5 6

जब while read a b cदूसरी बार लूप की स्थिति ( ) का मूल्यांकन किया जाता है, तो पाइप से अधिक इनपुट उपलब्ध नहीं होता है (हमने केवल इसे पाठ की एक पंक्ति प्रदान की है), इसलिए readकमांड सही के बजाय गलत का मूल्यांकन करता है और लूप बंद हो जाता है (कभी भी निष्पादित करने से पहले) शरीर दूसरी बार)।

1 : तकनीकी और विशिष्ट होना करने के लिए, निर्मित , जब तर्कों के रूप चर नाम पारित कर दिया, इनपुट, पढ़ता अलग "शब्दों" में विभाजित जब यह मुठभेड़ों आईएफएस खाली स्थान के (यह भी देखें इस सवाल और इस लेख )।read

2 : readनिर्दिष्ट अंतिम चर में इनपुट के किसी भी अतिरिक्त क्षेत्रों को जाम करने का व्यवहार कई स्क्रिप्टर्स के लिए गैर-संकेत है, पहली बार में। यह समझना आसान हो जाता है जब आप उस पर विचार करते हैं, जैसा कि फ्लोरियन डिस्च का जवाब कहता है , readहमेशा (पूरी कोशिश करेंगे) एक पूरी पंक्ति पढ़े - और readइसका उद्देश्य लूप के साथ और उसके बिना उपयोग करने योग्य है।


एलियाह, सभी विवरणों को समझाने के लिए समय निकालने के लिए धन्यवाद। मुझे संदेह whileथा कि इस उदाहरण में अपने सामान्य उद्देश्य की सेवा नहीं थी, लेकिन तब readकमान ने मुझे फेंक दिया ... किसी भी तरह, मैंने इसकी व्याख्या "जबकि read a b cझूठी नहीं है, करते हैं echo ..."। यह समझाने के लिए धन्यवाद कि यह वास्तव में कैसे काम करता है। मैं कल इस कोड में आया था और जानता था कि यह मुझे तब तक बग कर देगा, जब तक मुझे इसका पता नहीं चल जाता ... lol
linuxgringo

@linuxgringo दरअसल, लूप बॉडी को हर बार read a b cसही मूल्यांकन के लिए निष्पादित किया जाता है, और लूप कंडीशन ( read a b c) एक से अधिक बार चलती है। बिट यह केवल 1 बार सत्य का मूल्यांकन करता है। दूसरी बार, पाइप से पढ़ने के लिए कोई और इनपुट नहीं है, इसलिए फ़ाइल का अंत सामना करना पड़ता है, जिससे झूठेread वापस आ जाते हैं । ( विवरण से बाहर निकलने की स्थिति, "शेल स्क्रिप्टिंग में, नोटिंग के लिए," के अंतिम भाग को देखें, जो कि शेल स्क्रिप्टिंग में है, शून्य का मतलब है सत्य और नॉनज़रो का अर्थ है असत्य।) यदि आप इनपुट के एक से अधिक लाइन , लूप बॉडी को पाइप करते हैं। कई बार निष्पादित किया गया। help readwhile read ...
एलिया कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.