2011-10-06 12 views
44

जब मैं इस तरह बैश में read आदेश का उपयोग करने का प्रयास करें:बैश में पढ़ने के आदेश का उपयोग कैसे करें?

echo hello | read str 
echo $str 

कुछ भी नहीं है, गूँजती जबकि मुझे लगता है कि str स्ट्रिंग hello शामिल करना चाहिए। क्या कोई इस व्यवहार को समझने में मेरी मदद कर सकता है?

उत्तर

49

आपकी स्क्रिप्ट कमांड में read ठीक है। हालांकि, आप इसे पाइपलाइन में निष्पादित करते हैं, जिसका अर्थ यह है कि यह सबहेल में है, इसलिए, वे जो वैरिएबल पढ़ते हैं वे पैरेंट शैल में दिखाई नहीं दे रहे हैं। आप या तो

  • कदम subshell में स्क्रिप्ट के बाकी भी:

    echo hello | { read str 
        echo $str 
    } 
    
  • या कमांड प्रतिस्थापन का उपयोग subshell से बाहर चर का मान प्राप्त करने के लिए

    str=$(echo hello) 
    echo $str 
    

    या थोड़ा अधिक जटिल उदाहरण (एलएस के दूसरे तत्व को पकड़ना)

    str=$(ls | { read a; read a; echo $a; }) 
    echo $str 
    
+0

बहुत बढ़िया उदाहरण! मुझे ओएसएक्स पर घुंघराले ब्रेसिज़ के अंदर रिक्त स्थान डालने और प्रतिध्वनि के बाद अर्ध-कोलन डालने के लिए ओएसएक्स पर थोड़ी सी बात करनी पड़ी, जैसे: str = $ (ls | {read a; पढ़ना; echo $ a;}) –

+5

क्यों "पढ़ा है; एक पढ़ें;" आवश्यक * दो बार *? – javadba

+0

@javadba: इसे दो बार जरूरी नहीं है। दिया गया उदाहरण 'ls' से * दूसरा * आइटम देता है। एक 'पढ़ने' के साथ आपको पहला आइटम मिल जाएगा। मुझसे मत पूछें कि उत्तरदाता ने यह उदाहरण क्यों चुना। – Fritz

3

मूल्य गायब हो जाता है के बाद से पढ़ें आदेश एक अलग subshell में चलाया जाता है: Bash FAQ 24

-5

आप पाइप की जरूरत है?

echo -ne "$MENU" 
read NUMBER 
+1

-1: आपके 'echo' और' read' आदेश किसी भी तरह से जुड़े नहीं हैं। –

+0

क्या यह बुरा है? यह काम करता है ... – mmrtnt

+0

पोस्टर स्पष्ट रूप से एक वैरिएबल को मैन्युअल रूप से दर्ज किए बिना एक स्वचालित तरीके से पॉप्युलेट करना चाहता है। –

33

अन्य बैश विकल्प है कि एक subshell शामिल नहीं है:

read str <<END    # here-doc 
hello 
END 

read str <<< "hello"  # here-string 

read str < <(echo hello) # process substitution 
+2

आप यहां स्ट्रिंग के लिए एक प्रक्रिया का उपयोग कर सकते हैं जैसे कि 'एबीसी पढ़ें <<< $ (echo' aaa bbb ccc ')' – maxpolk

8

विशिष्ट उपयोग प्रकार दिखाई देंगे:

i=0 
echo -e "hello1\nhello2\nhello3" | while read str ; do 
    echo "$((++i)): $str" 
done 

और आउटपुट

1: hello1 
2: hello2 
3: hello3 
2

मेरे दो कहें सेंट यहाँ: केएसएच पर, read

पढ़ें आदेश से खोल चर की सेटिंग वर्तमान खोल निष्पादन वातावरण को प्रभावित करता है: क्योंकि the IBM AIX documentation के अनुसार, KSH के readकरता वर्तमान खोल पर्यावरण को प्रभावित के रूप में ing, एक चर होगा काम करने के लिए है।

यह सिर्फ मुझे के परिणामस्वरूप पता लगाना क्यों एक एक लाइनर read के साथ समाप्त कि मैं AIX पर एक असंख्य बार उपयोग किया है इससे पहले कि लिनक्स पर काम नहीं किया है एक अच्छा कुछ मिनट ... यह क्योंकि KSH करता है वर्तमान पर्यावरण को बचाता है और बाश नहीं करता है!

0

प्रिंटफ फ़ंक्शन का उपयोग करने के लिए एक और विकल्प पूरी तरह से है।

printf -v str 'hello' 

इसके अलावा, इस निर्माण, एकल उद्धरण जहां उचित के उपयोग के साथ संयुक्त, subshells और interpolative के हवाले के अन्य रूपों की बहु भागने की समस्याओं से बचने में मदद करता है।

+0

यदि आप सब कुछ हासिल करने का प्रयास कर रहे हैं, तो आप 'str =' hello'। मुझे लगता है कि यहां बिंदु एक चर के एक कमांड के आउटपुट को कैप्चर करना है। – mc0e

0

मैं वास्तव में केवल के साथ पढ़ने का उपयोग करें "जबकि" और एक पाश कार्य करें:

echo "This is NOT a test." | while read -r a b c theRest; do 
echo "$a" "$b" "$theRest"; done 

यह एक परीक्षण है।
इसके लायक होने के लिए, मैंने बैश में पढ़ने कमांड के साथ हमेशा उपयोग करने की सिफारिश देखी है।

संबंधित मुद्दे