2012-06-14 14 views
11

एकाधिक बयानों को करने का एक तरीका क्या किसी को बैश परीक्षण के भीतर कई कथन निष्पादित करने का तरीका पता है? तो अगर मैं का उपयोग करें:प्रति बैश परीक्षण और कथन

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1" 

और Var=1 सेट तो उत्पादन होता है: yes-1
तो मैं सेट Var=2 तो उत्पादन होता है: no-1

और इस काम के रूप में मैं उम्मीद थी। लेकिन मैं एक और बयान मिश्रण में निष्पादित करने के लिए जोड़ने के लिए कोशिश करते हैं और यह काम नहीं करता है:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2" 

के रूप में बैश आदेश पर समाप्त देखता कौन समझ में आता है; लेकिन ... यह वही नहीं है जो मैं चाहता हूं।

मैंने समूहबद्ध करने और evals और कार्यों की कोशिश की है और विफलताओं और सफलताओं की है लेकिन मैं वास्तव में ऐसा करना चाहता हूं कि यह काम एक पंक्ति पर है। क्या किसी के भी पास कोई सुझाव है?

उत्तर

19

सरल कमांड समूहिंग को काम करना चाहिए; हालांकि वाक्यविन्यास थोड़ा मुश्किल हो सकता है।

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; } 

कुछ बातें ध्यान रखें: एक if-then-else कथन का उपयोग करता है, तो आप कुछ भी और अधिक जटिल कर के बारे में

  1. हीड @ TVM की सलाह।

  2. ब्रेसिज़ के अंदर प्रत्येक कमांड को अर्द्ध-कोलन, यहां तक ​​कि अंतिम व्यक्ति के साथ समाप्त करने की आवश्यकता है।

  3. प्रत्येक ब्रेस को दोनों तरफ की जगहों के आस-पास के पाठ से अलग किया जाना चाहिए। ब्रेसेस bash में शब्द ब्रेक का कारण नहीं बनते हैं, इसलिए "{echo" एक शब्द है, "{echo" शब्द "echo" के बाद एक ब्रेस है।

+0

धन्यवाद मैंने इस तरह कुछ करने की कोशिश की थी लेकिन "मिस" दूसरे बयान के अंत में। –

+0

मैंने आपको सही उत्तर दिया क्योंकि ";" प्रत्येक कथन के अंत में यह या तो() subshell या {} समूहकरण के साथ काम करता है। अधिकांश मामलों में –

+0

आईएमओ, कमांड ग्रुपिंग बेहतर है। जैसे अगर आप किसी स्क्रिप्ट से बाहर निकलना चाहते हैं तो कुछ विफल हो जाता है तो आप 'foocmd || कर सकते हैं {echo foo विफल रहा; बाहर निकलें 1; } 'और यह एक निदान और बाहर निकलें मुद्रित करेगा। यदि आप समूहबद्ध करने के लिए सबहेल का उपयोग करते हैं, तो केवल सबहेल ही बाहर निकल जाएगा, न कि विज्ञान, जो लगभग निश्चित रूप से इच्छित प्रभाव नहीं है। – JVMATL

2

उपयोग subshells:

$ Var=1; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
yes-1 
yes-2 

$ Var=2; [[ $Var = 1 ]] && (echo "yes-1";echo "yes-2") || (echo "no-1";echo "no-2";) 
no-1 
no-2 
+1

हाँ यह काम करता है और मैं कसम खाता हूं कि मैंने ऐसा कुछ करने की कोशिश की।मैंने ध्यान दिया कि आपको ";" की आवश्यकता नहीं है कि आपके पास यह काम करने के लिए "नो -2" गूंज के बाद है लेकिन यह चोट नहीं पहुंचाता है और यह स्पष्ट करता है कि अगर आप "()" से "{}" बदलते हैं तो आपको ";" की आवश्यकता होती है। –

+0

मैंने पथ को नीचे जाने के लिए अपनी गिनती को उछाल दिया। जैसा कि "चेपर" से कहा गया है ";" प्रत्येक कथन के अंत में या तो() सबहेल या {} समूह काम करेगा! –

+0

@ pn1dude सहमत हैं, मैं हमेशा अपने सभी आदेशों के अंत में एक सबहेल में या समूह के लिए स्थिरता के लिए ''' का उपयोग करता हूं ('" विशेष मामले नियमों को तोड़ने के लिए पर्याप्त नहीं हैं "पी: पी)। एकमात्र कारण यह नहीं था कि मैं इस समय नहीं था क्योंकि मैं भीड़ में था और मैं अपना कोड कॉपी/पेस्ट करता हूं और बस मैं भूल गया: पी मुझे खुशी है कि मैंने मदद की, शुभकामनाएं – KurzedMetal

10

तो और बयान यदि नियमित रूप से उपयोग करने पर विचार। & & और || का उपयोग इस जैसे साधारण परीक्षण में उचित है:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!' 

लेकिन, निम्न आदेश पर विचार करें:

true && true && true && false && true || echo 'False!' 
False! 

या

true && { echo true; false ; } || { echo false; true ; } 
true 
false 

कभी भी एक गैर शून्य से बाहर निकलें स्थिति आ जाती है, आदेश के बाद | | निष्पादित किया जाता है। जैसा कि आप देख सकते हैं, यहां तक ​​कि कमांड समूह भी मदद नहीं करता है। subshell में

निष्पादन समान तरीके से व्यवहार करती है:

true && (true; echo true; true; false) || (true; echo true; false) 
true 
true 

बस नियमित रूप से यदि का उपयोग करें, यदि आप व्यवहार अगर उचित की जरूरत है।

+0

आप सही हो सकते हैं लेकिन समूहिंग काम पर दिखाई देती है। मैं आमतौर पर if-else-fi निर्माण का उपयोग करता हूं, लेकिन [[]] && || की छोटी मिठास की तरह और त्वरित और आसान कथन पर कभी-कभी मेरे पास 2 शामिल होते हैं और अगर-और-फाई एक त्वरित और गंदे के लिए बहुत अधिक कोड लेता है [[]] && || कई बयान के साथ। –

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