2013-03-27 8 views
17

का उपयोग कर अगर मैं लिखा है समारोहबयान और बुला समारोह बैश

check_log(){ 
    if [ -f "/usr/apps/appcheck.log" ] 
    then 
     return 1 
    else 
     return 0 
    fi 
} 

तो मैं अगर हालत

if [ check_log ]; 
then 
    ........statements.... 
fi 

होगा इस काम में इस फ़ंक्शन को कॉल करें तो क्या होगा? मैं यहां उलझन में हूं क्योंकि सफलता पर बैश वापसी 0 और विफलता पर 1। लेकिन मेरा काम 1 लौट रहा है और स्थिति 1/0 की जांच कर रही है, यह 1 हो जाती है और इसे विफलता देना चाहिए, लेकिन मेरी खोल स्क्रिप्ट स्थिति में गुजर रहा है।

क्या कोई इस मुद्दे पर प्रकाश डाल सकता है?

धन्यवाद!

+0

यदि कोई [कोई संख्या] कुछ करता है और यदि [0] कुछ भी नहीं करता है – JumpOffBox

+0

बैश में, आप इसके लिए एक संख्यात्मक संदर्भ का उपयोग करेंगे - '[]' या '[[]]' लेकिन ' (()) '- ऐसा है: 'अगर ((चर)); तो ... 'केवल तभी मूल्यांकन करेगा यदि' variable' में 0 से अधिक 0 –

+0

है ... वैसे, जब "बैश का उपयोग करके", सुनिश्चित करें कि आपका शेबैंग '#!/bin/bash' या' #!/usr/bin/env bash', '#!/bin/sh' नहीं; यदि यह उत्तरार्द्ध है, तो सभी बैश सुविधाओं को सक्षम नहीं किया जाएगा, इसलिए यहां दी गई सभी सलाह मान्य नहीं होंगी। –

उत्तर

35
if [ check_log ]; 

जब आप वर्ग कोष्ठक आप test आदेश लागू कर रहे हैं का उपयोग करें। यह if test check_log के बराबर है जो if test -n check_log के लिए शॉर्टेंड है, जिसका अर्थ है "यदि "check_log" खाली स्ट्रिंग नहीं है"। यह आपके check_log फ़ंक्शन को बिल्कुल कॉल नहीं करता है।

इस के बदले यह:

if check_log; 

वैसे, समारोह और अधिक बस लिखा जा सकता है के रूप में:

check_log() { 
    ! [ -f "/usr/apps/appcheck.log" ] 
} 

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

+0

के बारे में क्या है [6] कुछ करें और यदि [0] कुछ भी नहीं करें – JumpOffBox

+0

@JumpOffBox यदि आप संख्यात्मक परीक्षण करना चाहते हैं, तो आपको टेस्ट कमांड के न्यूमेरिक ऑपरेटरों में से एक का उपयोग करना होगा, जैसे 'if [6 -ne 0]; फिर ... '। लेकिन ध्यान दें कि आप उन संख्याओं में से किसी एक के स्थान पर फ़ंक्शन का उपयोग नहीं कर सकते हैं; आपको शैल फ़ंक्शन को कमांड के रूप में सोचना चाहिए (जो सफल हो सकता है या असफल हो सकता है), गणितीय फ़ंक्शन की तरह नहीं (जिसका प्राथमिक उद्देश्य मूल्य वापस करना है)। –

+0

@GordonDavisson कृपया किसी व्यक्ति के लिए स्पष्ट रूप से/bin/sh के बजाय बैश को लक्षित करने के लिए '[]' का सुझाव न दें; '((7! = 0)) 'बहुत अधिक पठनीय (और कम त्रुटि-प्रवण;' (()) ', जैसे' [[]]', स्ट्रिंग-स्प्लिटिंग और ग्लोब विस्तार को दबाता है, इसलिए उद्धरण नहीं हैं यह सुनिश्चित करने के लिए जरूरी है कि बयानों को अप्रत्याशित डेटा मानों के साथ भी लक्षित किया गया हो)। –

3

@ जॉन-kugelman, एक समाधान (और शायद सबसे सही) द्वारा बताया गया है निम्न सिंटैक्स का उपयोग करने के लिए है:

if check_log; 

लेकिन कोई वैकल्पिक समाधान है:

if [[ $(check_log; echo $?) -eq 0 ]]; 

मेरी निजी वरीयता उत्तरार्द्ध है क्योंकि यह सशर्त बयान के बीच स्थिरता को बढ़ावा देती है। लेकिन नकारात्मकता यह है कि क्योंकि यह कमांड प्रतिस्थापन पर निर्भर करता है, यह एक बाल प्रक्रिया (यानी एक सबहेल) को फोर्क करेगा जहां पहली विधि नहीं होगी।

विषय पर एक दिलचस्प पढ़ा यहां पाया जा सकता:

When does command substitution spawn more subshells than the same commands in isolation?

अपडेट किया गया (2017/10/20): इन के रूप में दूसरी विधि के लिए अपनी प्राथमिकता स्ट्राइकआउट दिनों मैं पर हूँ अनावश्यक फोर्किंग को रोकने के लिए एक मिशन। पहले समाधान में वाक्यविन्यास गैर-शैल प्रोग्रामिंग के लिए सहज नहीं है, लेकिन यह निश्चित रूप से अधिक कुशल है।

+0

दुनिया में क्यों आप दूसरे को पसंद करेंगे? –

+0

@ जॉन कुगेलमैन ने आपके सुझाव के अनुसार मेरी टिप्पणी अपडेट की। – markeissler

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