बश में सशर्त में कमांड का क्या अर्थ है "कुछ भी न करें"?


180

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

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

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

जवाबों:


340

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

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

से बैश मैनुअल :

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


3
@SaintHax नहीं, यह नहीं चलता है true। यह शेल में बनाया गया है, और कुछ भी नहीं करता है।
बारमर

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

3
@ सैंटहैक्स यदि कोई trueगैर-सशर्त संदर्भ में उपयोग करता है, तो मैं उन्हें इसे बदल दूंगा। if trueठीक है, then trueगलत लगता है।
बामर

1
बेशक, आप if ! condition; then do something; fiइसके बजाय उपयोग करने के लिए कोड को फिर से लिख सकते हैं if condition; then :; else do something; fi
बरमार

मैं आपसे सहमत हुँ। इस उदाहरण को लिखा जा सकता है अगर / elif / अन्यथा यौगिक स्थितियों का उपयोग कर और बेहतर होगा।
सेंटहैक्स

38

आप शायद सिर्फ 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

8
यदि आप परिणाम का परीक्षण नहीं करते हैं trueऔर falseजहां तक ​​स्क्रिप्ट का सवाल है, प्रभावी रूप से नो-ऑप्स हैं, लेकिन सिद्धांत रूप में वे कुछ ऐसे गोले में कांटा लगा सकते हैं जो इस वाक्यविन्यास को स्वीकार करते हैं तो शायद :बेहतर है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

3
इस सवाल का टैग बैश है। बैश में, trueऔर falseबिल्ट-इन हैं। बड़े गोले के लिए, true, false, और यहां तक कि :बाहरी आदेशों हो सकता है (हालांकि आप शायद ही में बाद देखना चाहते हैं बहुत पुराने गोले)।
कीथ थॉम्पसन

6
मैं :सिर्फ इसलिए पसंद करता हूं क्योंकि यह अधिक स्पष्ट है कि इरादा क्या है
Freedom_Ben

9

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

मैं ओपी उदाहरण का उपयोग करके एक सामान्य नियम देने की कोशिश करता हूं

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

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

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

इसलिए लागू नियम के साथ ओपी उदाहरण का पुनर्गठन किया जा सकता है:

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

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

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

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


5
एक कारण यह हो सकता है कि कोई व्यक्ति नो-ऑप चाहता है, जब शुरू में कोड को इस विचार के साथ संरचित किया जाता है कि कोई अनजाने साइड इफेक्ट्स के बिना "बाद में यहां कुछ जोड़ें" को जोड़ देगा। जैसे अगर कोई एक .bashrc में if-then-else-fi लगा echo "put stuff here"रहा है , अगर आप इसे डालते हैं तो कुछ गैर-लॉगिन उपयोग (जैसे scp टूट जाता है) को तोड़ देंगे, और केवल व्हाट्सएप / कमेंट्स एक रनटाइम त्रुटि का कारण बनता है।
एफिड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.