2013-07-11 3 views
104

कभी-कभी सशर्त बनाने के दौरान, मुझे कुछ भी करने के लिए कोड की आवश्यकता नहीं होती है, उदाहरण के लिए, मैं चाहता हूं कि $a "10" से अधिक हो, तो "1" प्रिंट करें, यदि $a "5" से कम है, अन्यथा प्रिंट करें "2":बाश में एक सशर्त में "कुछ भी नहीं" का क्या आदेश है?

if [ "$a" -ge 10 ] 
then 
elif [ "$a" -le 5 ] 
then 
    echo "1" 
else 
    echo "2" 
fi 

हालांकि यह एक त्रुटि बनाता है। क्या कोई ऐसा आदेश है जो कुछ भी नहीं करेगा और जो मेरी स्क्रिप्ट को धीमा नहीं करेगा?

उत्तर

207

खोल में नो-ऑप कमांड : (कोलन) है।

if [ "$a" -ge 10 ] 
then 
    : 
elif [ "$a" -le 5 ] 
then 
    echo "1" 
else 
    echo "2" 
fi 

bash manual से:

: (एक कोलन)
तर्क के विस्तार और पुनर्निर्देशन प्रदर्शन से परे कुछ न करें। वापसी की स्थिति शून्य है।

+0

का इरादा क्या है,: "सत्य" चलाने के लिए एक ऑपरेटर है। मैं इस तरह के मामलों में बहुत पसंद करता हूं, क्योंकि इसे पढ़ने में बहुत आसान है। – SaintHax

+1

@SaintHax नहीं, यह 'true' नहीं चलाता है। यह खोल में बनाया गया है, और कुछ भी नहीं करता है। – Barmar

+1

यह शेल बनाया गया है (आप सही हैं), यह सच है (स्थिति 0) जैसा सच है, और इसे पढ़ने में और अधिक मुश्किल है। बैश एक देवओप्स भाषा है, और यदि मेरी टीम पर किसी ने लिखा है, तो मैं उन्हें बदल दूंगा। – SaintHax

28

आप शायद सिर्फ true आदेश का उपयोग कर सकते हैं:

if [ "$a" -ge 10 ]; then 
    true 
elif [ "$a" -le 5 ]; then 
    echo "1" 
else 
    echo "2" 
fi 

एक वैकल्पिक, अपने उदाहरण के मामले में (लेकिन जरूरी हर जगह नहीं) फिर से आदेश करने के लिए अपने यदि/बाकी:

if [ "$a" -le 5 ]; then 
    echo "1" 
elif [ "$a" -lt 10 ]; then 
    echo "2" 
fi 
+7

यदि आप परिणाम का परीक्षण नहीं करते हैं तो 'सत्य' और 'झूठी' प्रभावी रूप से स्क्रिप्ट के संबंध में नो-ऑप्स होते हैं, लेकिन सिद्धांत रूप में वे * कुछ सिल्लों में कांटा सकते हैं जो इस वाक्यविन्यास को स्वीकार करते हैं ':' बेहतर है। – dmckee

+2

सवाल टैग किया गया है bash। बैश में, 'सत्य' और 'झूठी' अंतर्निहित हैं। पुराने गोले के लिए, 'सत्य', 'झूठा', और यहां तक ​​कि ':' बाहरी आदेश भी हो सकता है (हालांकि आप शायद बाद वाले * बहुत पुराने पुराने गोले में देखेंगे)। –

+4

मैं '' 'पसंद करता हूं क्योंकि यह अधिक स्पष्ट है कि शिक्षा के लिए –

9

हालांकि मैं, कई (यदि नहीं सबसे) कोई-op आदेश concering समस्याओं जब एक "इस शाखा मैं कुछ भी नहीं क्या करना है में " सोच सकते हैं मूल सवाल का जवाब नहीं कर रहा हूँ बस द्वारा नजरअंदाज किया जा सकता है तर्क पुनर्गठन ताकि यह शाखा न हो।

मैं, ऑप्स उदाहरण

जब $ "10" से अधिक है कुछ नहीं कर का उपयोग करके एक सामान्य नियम देने की कोशिश प्रिंट "1" अगर $ एक, "5" से भी कम है अन्यथा, प्रिंट "2"

हम एक शाखा जहां $a हो जाता है 10 से अधिक है, तो $a < 10 के रूप में एक सामान्य स्थिति हर दूसरे, निम्न स्थिति के लिए लागू किया जा सकता से बचने के लिए किया है।

सामान्य शब्दों में, जब आप कहते हैं कुछ भी नहीं जब एक्स, तो यह के रूप में अलग तरीके से व्यक्त एक शाखा है, जहां एक्स से बचें। आम तौर पर आप आसानी से एक्स को अस्वीकार करके और अन्य सभी स्थितियों में इसे लागू करके बच सकते हैं।

तो नियम लागू किए गए ऑप्स उदाहरण का पुनर्गठन किया जा सकता है के रूप में:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ] 
then 
    echo "1" 
elif [ "$a" -lt 10 ] 
then 
    echo "2" 
fi 

बस $a < 10 हालत में ऊपर, enclosing सब कुछ का एक परिवर्तन:

if [ "$a" -lt 10 ] 
then 
    if [ "$a" -le 5 ] 
    then 
     echo "1" 
    else 
     echo "2" 
    fi 
fi 

(इस विशिष्ट उदाहरण के लिए @Flimzys restructuring निश्चित रूप से बेहतर है, लेकिन मैं सभी लोगों के लिए एक सामान्य नियम देना चाहता था कि कुछ भी कैसे करें।)

+0

एक कारण है कि कोई नो-ऑप नहीं ले सकता है जब प्रारंभ में इस विचार के साथ कोड को संरचित किया जाता है कि कोई अनजान साइड इफेक्ट्स के बिना "बाद में कुछ जोड़ें" जोड़ देगा। जैसे यदि कोई .bashrc में if-then-else-fi डाल रहा है, यदि आप यहां 'echo' डालते हैं तो सामान डालते हैं "'यह कुछ गैर-लॉगिन उपयोगों को तोड़ देगा (जैसे एसपीपी टूटा हुआ है), और केवल व्हाइटस्पेस/टिप्पणियां रनटाइम त्रुटि का कारण बनती हैं। – Aphoid

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