$ का उपयोग कर? एक if स्टेटमेंट में


12
function foo {
   (cd $FOOBAR;
   <some command>
   if [$? -ne 0]
   then
      echo "Nope!"
   else
      echo "OK!"
   fi
   )
}

मैं ऊपर दिए गए एक फंक्शन को लिखने की कोशिश कर रहा हूं और इसे अपनी .bashrc फाइल में रख सकता हूं। मैं फ़ाइल स्रोत और चलाने के बाद, मुझे मिलता है:

कुल समय: 51 सेकंड
-बैश: [1: कमांड
ठीक नहीं मिला !

क्या कोई मुझे यह समझने में मदद कर सकता है कि मैंने क्या गलत किया?


4
यदि $?किसी ifकथन के साथ 0 के बराबर परीक्षण करना व्यर्थ है, तोif एक कमांड की अपेक्षा करता है और यदि कहा जाता है कि 0यह रिटर्न देता है , तो यह ब्लॉक में कोड चलाता है। इसलिए if true; then echo hello; fiगूंज नमस्ते के बाद से आदेश होगा trueलौटे 0
llua

1
@llua यह व्यर्थ नहीं है। $?अंतिम पाइपलाइन की स्थिति रखता है , जो कथन में test( [) कमांड नहीं है if। उदाहरण परीक्षण कर रहा है कि क्या some commandसफल रहा। आप के साथ भी ऐसा कर सकते हैं &&और ||, लेकिन यह लंबे समय तक, अपठनीय लाइनों की तुलना कर सकते हैं if [ $? -eq 0 ]। उसी तर्क के लिए जाता हैif some command
bonsaiviking 17

@bonsaiviking मुझे अच्छी तरह से पता है कि इसका $?विस्तार क्या है, मैं इंगित कर testरहा हूं कि इस्तेमाल होने का कोई मतलब नहीं है; चूँकि if some commandएक कथन के साथ एक ही काम करता है बनाम दो अलग-अलग कथन होते हैं। यदि आदेश पहले से ही लंबा है, तो तीन और वर्ण जोड़ने से 'अपठनीय' बहुत अधिक 'अपठनीय' नहीं बन जाएगा।
llua

जवाबों:


33

[पहले और बाद में एक स्थान जोड़ें ]:

function foo {
   (cd $FOOBAR;
   <some command>
   if [ $? -ne 0 ]
   then
      echo "Nope!"
   else
      echo "OK!"
   fi
   )
}

[एक खोल builtin है, यह एक आदेश की तरह ही है echo, read, expr... यह इसके बाद एक स्थान की आवश्यकता होती है, और एक मिलान की आवश्यकता है ]

लेखन [ $? -ne 0 ]वास्तव में लागू किया जाता है [और यह 4 मानकों दे: $?, -ne, 0, और ]

नोट: यह तथ्य कि आपको एक त्रुटि मिल रही है, [1: command not foundजिसका अर्थ है कि $?मूल्य था 1


1
मैंने अभी सत्यापित किया है कि आपका उत्तर मेरे लिनक्स वीएम पर सही है।
samiam

[के testरूप में अच्छी तरह से एक लिंक है
रिकी बीम

2
अधिकांश गोले में @RickyBeam, [शेल निर्मित है, और इसका /usr/bin/[उपयोग शायद ही कभी किया जाता है।
पैट्रिक

20

या आप $?पूरी तरह से छोड़ सकते हैं। यदि आपकी आज्ञा है cmd, तो निम्नलिखित कार्य करना चाहिए:

function foo {
   (cd $FOOBAR;
   if cmd
   then
      echo "OK!"
   else
      echo "Nope!"
   fi
   )
}

6

इसका उपयोग करने से पहले किसी वैरिएबल पर रिटर्न वैल्यू असाइन करना अच्छा अभ्यास है

retval="$?"
if [ $retval -ne 0 ]

यह आपको रिटर्न वैल्यू का पुन: उपयोग करने की अनुमति देता है। जैसे कि अगर ... एलीफ ... और ... कथन।


-1: आप अंतरिक्ष के बाद [( अंतरिक्ष के बिना, यह एक सिंटैक्स त्रुटि हो जाती है bash) भूल गए , यदि आप अपनी त्रुटि को संपादित करते हैं और ठीक करते हैं, तो यह पूर्ववत कर देगा।
समिया

हाँ, तुम सही हो। मैंने ठीक कर दिया।
अब्दुल

@samiam कि पिछले टिप्पणी आप पर निर्देशित किया गया था
terdon

4
:) क्या आप अपने उत्तर को थोड़ा बढ़ा सकते हैं। यह अच्छा अभ्यास क्यों है? किस तरह की त्रुटियों से बचा जा सकता है?
terdon

1
@terdon यह $?सीधे उपयोग करने के लिए बुरा अभ्यास है क्योंकि यदि आप कभी भी तोड़ देंगे, तो स्क्रिप्ट को बाद में संपादित करते समय, कमांड और $?चेक के बीच एक लाइन डालें ।
samiam

3

केवल यही कारण है कि आप $?एक [कमांड के तर्क के रूप में उपयोग करना चाहते हैं (चाहे वह [कमांड किसी ifस्टेटमेंट के भाग में है या नहीं) जब आप किसी विशिष्ट रिटर्न स्टेटस में भेदभाव करना चाहते हैं, जैसे:

until
  cmd
  [ "$?" -gt 1 ]
do
  something
done

उन सभी के लिए वाक्य रचना if, while, until... बयान है

if cmd-list1
then cmd-list2
else cmd-list3
fi

कौन चलाता cmd-list2है, तो cmd-list1सफल हुआ या cmd-list3अन्यथा।

[ "$?" -eq 0 ]आदेश नो-सेशन है। यह $?0 पर सेट होता है यदि $?0 है, और $?गैर-शून्य पर यदि यह गैर-शून्य है।

यदि आप कुछ चलाना चाहते हैं यदि cmdअसफल हो, तो यह है:

if ! cmd
then ...
fi

आम तौर पर, आपको यह $?बताने की जरूरत नहीं है कि किस मूल्य का मतलब क्या है trueया अकेले false। केवल मामले ऐसे हैं जैसे मैंने ऊपर कहा है कि यदि आपको किसी विशिष्ट मूल्य पर भेदभाव करने की आवश्यकता है, या यदि आपको इसे बाद में सहेजने की आवश्यकता है (उदाहरण के लिए इसे किसी फ़ंक्शन के रिटर्न मान के रूप में)

f() {
  cmd; ret=$?
  some cleanup
  return "$ret"
}

यह भी याद रखें कि एक वैरिएबल को छोड़ना स्प्लिट + ग्लोब ऑपरेटर है। यह उस ऑपरेटर को यहां लागू करने के लिए समझ में नहीं आता है, इसलिए यह होना चाहिए:

[ "$?" -ne 0 ]

नहीं [ $? -ne 0 ], अकेले जाने दो [$? -ne 0 ](जो केवल [कमांड को लागू करेगा यदि $IFSपहले वर्ण को शामिल करने के लिए हुआ हो $?)।

यह भी ध्यान दें कि किसी फ़ंक्शन को परिभाषित करने का बॉर्न तरीका function-name()एक कमांड के सामने रहना है। सिवाय इसके कि कवच की तरह हर बॉर्न में मामला है bashऔर yash(और के हाल के संस्करणों posh) जो केवल एक यौगिक आदेश (मिश्रित आदेशों जा रहा है की अनुमति देते हैं {...}या (...)या तरह बातें for...done, if...fi...

function foo { ... }है kshसमारोह परिभाषा वाक्य रचना। ऐसा कोई कारण नहीं है कि आप इसका उपयोग क्यों करना चाहते हैं।

आपका कोड आंशिक रूप से (POSIXly) लिखा जा सकता है:

foo() (
  cd -P -- "$FOOBAR" || return # what if the cd failed!
  if
    <some command>
  then
    echo 'OK!'
  else
    echo 'Nope!'
  fi
)

यह भी ध्यान दें कि इसके cdबिना -Pबहुत ही विशेष अर्थ है (पथ जो ..किसी भी अन्य कमांड से अलग घटकों को संभालता है ), इसलिए भ्रम से बचने के लिए इसे स्क्रिप्ट में शामिल करना बेहतर है।

(कि समारोह रिटर्न falseअगर cdविफल रहता है, लेकिन यदि नहीं <some command>विफल रहता है)।


1

मुझे विश्वास है कि नीचे दी गई कमांड आपको वह सब कुछ देगी जो आप एक पंक्ति में चाहते हैं।

(( verify = $?!=0?'Nope!':'OK!' ))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.