2012-11-30 14 views
32

मेरे पास मेरी शेल स्क्रिप्ट में कोड नीचे है जो सोते रहेंगे यदि उसे कोई फ़ाइल नहीं मिलती है। और यह आधे घंटे तक सोता है लेकिन वर्तमान में मेरे पास कोई काउंटर नहीं है जैसे कि नीचे दिए गए कोड को केवल 20 बार निष्पादित करें और फिर प्रोग्राम से बाहर निकलें यदि फाइलें अभी भी नहीं हैं (मतलब 20 चेक के बाद कुछ भी नहीं करते हैं और बाहर निकलें पूर्ण लिपि)।शेल स्क्रिप्ट में काउंटर जोड़ना

इस समस्या को करने का सबसे अच्छा तरीका क्या है? ताकि मैं उन ईमेल को देखकर भी जागरूक हूं जिन्हें उसने 20 बार कोशिश की है।

आशा है कि मैं काफी स्पष्ट हूं।

while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     break 
    else 
     echo "Sleeping for half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

उत्तर

54

यहाँ कैसे आप एक काउंटर को लागू दे सकता है:

counter=0 
while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     exit 0 
    elif [[ "$counter" -gt 20 ]]; then 
     echo "Counter: $counter times reached; Exiting loop!" 
     exit 1 
    else 
     counter=$((counter+1)) 
     echo "Counter: $counter time(s); Sleeping for another half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

कुछ स्पष्टीकरण:

  • counter=$((counter+1)) - यह कैसे आप एक काउंटर बढ़ाने के कर सकते हैं। $counter के लिए इस मामले में डबल ब्रांड्स के अंदर वैकल्पिक है।
  • elif [[ "$counter" -gt 20 ]]; then - यह जांचता है कि $counter20 से अधिक नहीं है। यदि ऐसा है, तो यह उचित संदेश आउटपुट करता है और आपके लूप के बाहर टूट जाता है।
+0

सुझाव के लिए धन्यवाद सैम्पसन। 'Elif' में' ब्रेक 'करने के बजाय क्या मैं स्क्रिप्ट से बाहर निकल सकता हूं? मैं यह क्यों पूछ रहा हूं क्योंकि 'पूर्ण' लाइन के बाद मेरे पास निष्पादित करने के लिए बहुत अधिक कोड है, इसलिए फाइलें मौजूद थीं लेकिन काउंटर की इस जांच को जोड़ने के बाद, मैं उन कोड को निष्पादित नहीं करना चाहता था यदि फाइलें अभी भी नहीं हैं तो 20 बार जांच कर रहे हैं। – ferhan

+0

@TechGeeky स्क्रिप्ट से बाहर निकलने के लिए, 'बाहर निकलें 0' (अगर अपेक्षित के रूप में समाप्त हो रहा है) या' बाहर निकलें 1 '(यदि समाप्त हो रहा है और आप कुछ त्रुटि इंगित करना चाहते हैं) –

+0

मैंने उपरोक्त कोड की कोशिश की और मुझे अपवाद मिल रहा है 'काउंटर = $ ((काउंटर + 1)) 'यह लाइन' $ 'अप्रत्याशित है। ऐसा क्यों है? मैं उपरोक्त स्क्रिप्ट को 'sh -x test1.sh' – ferhan

4

इस प्रयास करें:

counter=0 
while true; do 
    if /home/hadoop/latest/bin/hadoop fs -ls /apps/hdtech/bds/quality-rt/dt=$DATE_YEST_FORMAT2 then 
     echo "Files Present" | mailx -s "File Present" -r [email protected] [email protected] 
     break 
    elif [[ "$counter" -gt 20 ]]; then 
     echo "Counter limit reached, exit script." 
     exit 1 
    else 
     let counter++ 
     echo "Sleeping for another half an hour" | mailx -s "Time to Sleep Now" -r [email protected] [email protected] 
     sleep 1800 
    fi 
done 

स्पष्टीकरण

  • break - यदि फ़ाइलें मौजूद हैं, इसे तोड़ने और स्क्रिप्ट फ़ाइलों को प्रोसेस करने की अनुमति देगा।
  • [[ "$counter" -gt 20 ]] - यदि काउंटर वैरिएबल 20 से अधिक है, तो स्क्रिप्ट बाहर निकल जाएगी।
  • let counter++ - प्रत्येक पास पर काउंटर को 1 से बढ़ाता है।
संबंधित मुद्दे