दिलचस्प पोस्ट
एक WPF कंटेनर के बच्चों को किस प्रकार से प्राप्त करें? एएसपी.NET MVC 4 अनुमति कोड के साथ कस्टम ऑथराइज विशेषता (बिना भूमिकाओं) आईफोन पर भी चुप मोड में ध्वनि चलाएं Node.js में, मैं अपनी अन्य फ़ाइलों से "शामिल" फ़ंक्शन कैसे करूं? स्रोत कोड में सबसे अच्छी टिप्पणी क्या है जिसे आपने कभी सामना किया है? कैसे क्रोम में "संपत्ति परिवर्तन पर ब्रेक"? जांचें कि क्या फ़ाइल खोल स्क्रिप्ट में वाइल्डकार्ड के साथ मौजूद है 'का प्रयोग' कथन नामस्थान के अंदर या बाहर होना चाहिए? सोप क्लाइंट क्लास का उपयोग करके एक PHP SOAP कॉल कैसे करें MySQL – अद्यतन क्वेरी पर आधारित क्वेरी अपडेट करें बाइंडपरम और बाइंड वैल्यू में अंतर क्या है? यूटीएफ -8, यूटीएफ -16, और यूटीएफ -32 स्प्रिंग डाटा रेस्ट और कॉर्स ExecJS और जावास्क्रिप्ट रनटाइम नहीं मिला क्या Xcode 4.2 और आईओएस 5 एसडीके का उपयोग करते समय पुराने आईओएस संस्करणों को लक्षित करना संभव है?

एक लूप के भीतर संशोधित एक चर याद नहीं है

निम्नलिखित प्रोग्राम में, अगर मैं चर $foo को पहले 1 कथन के अंदर मान 1 पर सेट करता हूं, तो यह इस अर्थ में काम करता है कि इसका बयान I स्टेटमेंट के बाद याद किया जाता है। हालांकि, जब मैं उसी वैरिएबल को 2 के अंदर मान के अंदर सेट करता हूं जो कि एक while वक्त में होता है, तो यह लूप के बाद भूल जाता है। यह व्यवहार कर रहा है जैसे कि मैं पाश के भीतर चर $foo की किसी प्रकार की प्रतिलिपि का उपयोग कर रहा हूं और मैं केवल उस विशिष्ट प्रति को संशोधित कर रहा हूं। यहां एक पूर्ण परीक्षण कार्यक्रम है:

 #!/bin/bash set -e set -u foo=0 bar="hello" if [[ "$bar" == "hello" ]] then foo=1 echo "Setting \$foo to 1: $foo" fi echo "Variable \$foo after if statement: $foo" lines="first line\nsecond line\nthird line" echo -e $lines | while read line do if [[ "$line" == "second line" ]] then foo=2 echo "Variable \$foo updated to $foo inside if inside while loop" fi echo "Value of \$foo in while loop body: $foo" done echo "Variable \$foo after while loop: $foo" # Output: # $ ./testbash.sh # Setting $foo to 1: 1 # Variable $foo after if statement: 1 # Value of $foo in while loop body: 1 # Variable $foo updated to 2 inside if inside while loop # Value of $foo in while loop body: 2 # Value of $foo in while loop body: 2 # Variable $foo after while loop: 1 # bash --version # GNU bash, version 4.1.10(4)-release (i686-pc-cygwin) 

वेब के समाधान से एकत्रित समाधान "एक लूप के भीतर संशोधित एक चर याद नहीं है"

 echo -e $lines | while read line ... done 

while लूप एक सबशेल्ड में निष्पादित होता है इसलिए कोई परिवर्तन जो आप चर में करते हैं वह सबशेल्ड के बाहर आने के बाद उपलब्ध नहीं होगा।

इसके बजाय आप मुख्य शेल प्रक्रिया में रहने के दौरान लूप को फिर से लिखने के लिए यहां स्ट्रिंग का उपयोग कर सकते हैं; केवल echo -e $lines एक सबशेल्ड में चलेंगी:

 while read line do if [[ "$line" == "second line" ]] then foo=2 echo "Variable \$foo updated to $foo inside if inside while loop" fi echo "Value of \$foo in while loop body: $foo" done <<< "$(echo -e "$lines")" 

अपडेट # 2

स्पष्टीकरण ब्लू चन्द्रमाओं के उत्तर में है।

वैकल्पिक समाधान:

echo समाप्त करें

 while read line; do ... done <<EOT first line second line third line EOT 

इको-इ-द-डॉक्युमेंट के अंदर इको जोड़ें

 while read line; do ... done <<EOT $(echo -e $lines) EOT 

पार्श्व में echo चलाएं:

 coproc echo -e $lines while read -u ${COPROC[0]} line; do ... done 

किसी फ़ाइल को पुनर्निर्देशन को स्पष्ट रूप से संभालें ( < < ! में स्थान को ध्यान में रखें:

 exec 3< <(echo -e $lines) while read -u 3 line; do ... done 

या सिर्फ stdin पुनर्निर्देशित करें:

 while read line; do ... done < <(echo -e $lines) 

और chepner लिए एक ( echo नष्ट करना):

 arr=("first line" "second line" "third line"); for((i=0;i<${#arr[*]};++i)) { line=${arr[i]}; ... } 

परिवर्तनीय $lines को एक नया उप-शेल शुरू किए बिना एक सरणी में कनवर्ट किया जा सकता है अक्षरों और स्ट्रिंग को सरणी तत्वों में विभाजित करने के लिए वर्णों को \ और n को कुछ चरित्र में परिवर्तित किया जाना चाहिए (जैसे कि एक वास्तविक नई पंक्ति वर्ण) और IFS (आंतरिक फ़ील्ड सेपरेटर) चर का उपयोग करें। ऐसा किया जा सकता है:

 lines="first line\nsecond line\nthird line" echo "$lines" OIFS="$IFS" IFS=$'\n' arr=(${lines//\\n/$'\n'}) # Conversion IFS="$OIFS" echo "${arr[@]}", Length: ${#arr[*]} set|grep ^arr 

परिणाम है

 first line\nsecond line\nthird line first line second line third line, Length: 3 arr=([0]="first line" [1]="second line" [2]="third line") 

आप इस बास अकसर किये गए सवाल पूछने के लिए 742342nd उपयोगकर्ता हैं । उत्तर में पाइप्स द्वारा बनाए गए सबशेल्स में निर्धारित चर के सामान्य मामले भी बताए गए हैं:

ई 4) यदि मैं एक कमांड के आउटपुट को read variable में पाइप करता हूं, तो आउटपुट को $variable में दिखाई क्यों नहीं जाता जब read command खत्म हो जाता है?

यह यूनिक्स प्रक्रियाओं के बीच माता-पिता के रिश्ते के साथ करना है यह पाइपलाइनों में चलने वाले सभी आदेशों को प्रभावित करता है, read लिए सिर्फ साधारण कॉल read । उदाहरण के लिए, एक कमांड की आउटपुट को एक while लूप में पाइप करके बार-बार कॉल किया जाता है, उसी प्रकार का व्यवहार होता है।

एक पाइप लाइन के प्रत्येक तत्व, यहां तक ​​कि एक बिल्टिन या शेल फ़ंक्शन, एक अलग प्रक्रिया में चलाती है, पाइप लाइन चलने वाले शेल का एक बच्चा। उपप्रोसेस अपने माता-पिता के वातावरण को प्रभावित नहीं कर सकता जब read आदेश इनपुट को चर सेट करता है, तो वह चर केवल सबशेल्ड में सेट होता है, पैरेंट शेल नहीं। जब सबशेल्ड बाहर निकलता है, तो चर का मान खो जाता है।

read variable साथ समाप्त होने वाली कई पाइपलाइनों को कमांड प्रतिस्थापनों में परिवर्तित किया जा सकता है, जो एक निर्दिष्ट कमांड के आउटपुट को कैप्चर करेगा। उत्पादन फिर एक चर को सौंपा जा सकता है:

 grep ^gnu /usr/lib/news/active | wc -l | read ngroup 

में परिवर्तित किया जा सकता है

 ngroup=$(grep ^gnu /usr/lib/news/active | wc -l) 

यह दुर्भाग्य से, कई चर के बीच पाठ को विभाजित करने के लिए काम नहीं करता, जैसा कि कई वैरिएबल तर्क दिए जाने के दौरान पढ़ा जाता है। यदि आपको यह करने की आवश्यकता है, तो आप या तो आउटपुट को एक चर में पढ़कर ऊपर दिए गए कमांड प्रतिस्थापन का उपयोग कर सकते हैं और बैश पैटर्न हटाने के विस्तार ऑपरेटर का उपयोग करके चर का इस्तेमाल कर सकते हैं या निम्न दृष्टिकोण के कुछ प्रकार का उपयोग कर सकते हैं।

कहें / usr / local / bin / ipaddr निम्न शेल स्क्रिप्ट है:

 #! /bin/sh host `hostname` | awk '/address/ {print $NF}' 

के बजाय का उपयोग करने का

 /usr/local/bin/ipaddr | read ABCD 

स्थानीय मशीन के आईपी पते को अलग-अलग ऑकटेट में तोड़ने के लिए, उपयोग करें

 OIFS="$IFS" IFS=. set -- $(/usr/local/bin/ipaddr) IFS="$OIFS" A="$1" B="$2" C="$3" D="$4" 

सावधान रहें, हालांकि, यह शेल की स्थितीय मापदंडों को बदल देगा। अगर आपको इसकी आवश्यकता है, तो आपको यह करने से पहले उन्हें बचा जाना चाहिए।

यह सामान्य दृष्टिकोण है – ज्यादातर मामलों में आपको एक अलग मूल्य के लिए $ IFS सेट करने की आवश्यकता नहीं होगी।

कुछ अन्य उपयोगकर्ता द्वारा प्रदत्त विकल्प में शामिल हैं:

 read ABCD << HERE $(IFS=.; echo $(/usr/local/bin/ipaddr)) HERE 

और, जहां प्रक्रिया प्रतिस्थापन उपलब्ध है,

 read ABCD < <(IFS=.; echo $(/usr/local/bin/ipaddr)) 

हम्म् … मैं लगभग कसम खाता हूँ कि यह मूल बॉर्न शेल के लिए काम किया है, लेकिन अभी जांच करने के लिए अभी चल रहे प्रतिलिपि तक पहुंच नहीं है।

हालांकि, समस्या का एक बहुत ही कम मामला है।

स्क्रिप्ट की पहली पंक्ति को यहां से बदलें:

 #!/bin/bash 

सेवा मेरे

 #!/bin/ksh 

और वोला! एक पाइप लाइन के अंत में पढ़ा जाता है ठीक काम करता है, यह मानते हुए कि आपके पास कॉर्न शैल स्थापित है।

कैसे एक बहुत सरल विधि के बारे में

  +call your while loop in a function - set your value inside (nonsense, but shows the example) - return your value inside +capture your value outside +set outside +display outside #!/bin/bash # set -e # set -u # No idea why you need this, not using here foo=0 bar="hello" if [[ "$bar" == "hello" ]] then foo=1 echo "Setting \$foo to $foo" fi echo "Variable \$foo after if statement: $foo" lines="first line\nsecond line\nthird line" function my_while_loop { echo -e $lines | while read line do if [[ "$line" == "second line" ]] then foo=2; return 2; echo "Variable \$foo updated to $foo inside if inside while loop" fi echo -e $lines | while read line do if [[ "$line" == "second line" ]] then foo=2; echo "Variable \$foo updated to $foo inside if inside while loop" return 2; fi # Code below won't be executed since we returned from function in 'if' statement # We aready reported the $foo var beint set to 2 anyway echo "Value of \$foo in while loop body: $foo" done } my_while_loop; foo="$?" echo "Variable \$foo after while loop: $foo" Output: Setting $foo 1 Variable $foo after if statement: 1 Value of $foo in while loop body: 1 Variable $foo after while loop: 2 bash --version GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc.