2009-06-16 13 views
7

में निकास कोड जोड़ें (संग्रह) जोड़ें (मुझे एक स्क्रिप्ट में कुछ अलग निष्पादन पर निर्भर रहने की आवश्यकता है और उन्हें सभी को बदसूरत 'if' कथन में बंडल नहीं करना चाहते हैं। मैं निकास कोड '$?' लेना चाहता हूं प्रत्येक निष्पादन का और इसे जोड़ें; अंत में, यदि यह मान सीमा पर है - मैं एक आदेश निष्पादित करना चाहता हूं।बाश

छद्म कोड:

ALLOWEDERROR=5 

run_something 
RESULT=$? 
..other things.. 

run_something_else 
RESULT=$RESULT + $? 

if [ $RESULT -gt ALLOWEDERROR ] 
    then echo "Too many errors" 
fi 

मुद्दा: भले ही इंटरनेट अन्यथा दावा करता है, बैश परिणाम और $ के इलाज के लिए मना कर दिया? पूर्णांक के रूप में। सही वाक्यविन्यास क्या है?

धन्यवाद।

उत्तर

9

आप trap builtin पर एक नज़र लेने के लिए देखने के लिए अगर यह मददगार होगा चाहते हो सकता है:

help trap 

या

man bash 

आप इस तरह त्रुटियों के लिए एक जाल सेट कर सकते हैं:

#!/bin/bash 

AllowedError=5 

SomeErrorHandler() { 
    ((errcount++))  # or ((errcount += $?)) 
    if ((errcount > $AllowedError)) 
    then 
     echo "Too many errors" 
     exit $errcount 
    fi 
} 

trap SomeErrorHandler ERR 

for i in {1..6} 
do 
    false 
    echo "Reached $i"  # "Reached 6" is never printed 
done 

echo "completed"   # this is never printed 

आप त्रुटियों गिनती (और केवल वे कर रहे हैं जब त्रुटियों) उपयोग करने के बजाय इस तरह तो "$?", तो आप के बारे में चिंता करने की जरूरत नहीं शून्य या एक के अलावा अन्य मान वापस करें। 127 का एक एकल रिटर्न वैल्यू, उदाहरण के लिए, आपको तुरंत अपने थ्रेसहोल्ड पर फेंक देगा। ERR के अतिरिक्त आप अन्य सिग्नल के लिए trap एस भी पंजीकृत कर सकते हैं।

13

एक त्वरित प्रयोग और डुबकी बैश की जानकारी में कहते हैं:

declare -i RESULT=$RESULT + $? 

जब से तुम परिणाम के लिए कई बार जोड़ रहे हैं, तो आप शुरू में घोषणा करते हैं, इस तरह उपयोग कर सकते हैं:

declare -i RESULT=0 

true 
RESULT+=$? 
false 
RESULT+=$? 
false 
RESULT+=$? 

echo $RESULT 
2 

जो बहुत साफ दिखता है।

declare -i कहता है कि चर पूर्णांक है।

वैकल्पिक रूप से आप यह घोषणा से बचने और गणित अभिव्यक्ति कोष्ठकों का उपयोग कर सकते हैं:

RESULT=$(($RESULT+$?)) 
+1

त्रुटि (या सफलता) पर ध्यान दिए बिना अंतिम बार केवल इसे कितनी बार निष्पादित किया जाता है: RESULT = $ (($ RESULT + 1))। यदि आप $ (()) निर्माण का उपयोग करना चाहते हैं, तो आपको $ जोड़ने की आवश्यकता है? 1 के बजाय (डेव हिनटन के जवाब में)। अन्यथा, जब आदेश 0 लौटाता है तब भी आप बढ़ रहे होंगे या आप मेरे जवाब में एक जाल का उपयोग कर सकते हैं। –

+1

इसके लिए धन्यवाद, मैंने आपके फ़िक्स में संपादित किया है। मुझे आपका जवाब पसंद है। –

+0

यह काम नहीं करेगा यदि एक पंक्ति के पास 1 का रिटर्न कोड है और दूसरे के पास 1 का रिटर्न कोड है, क्योंकि वे सफलता की तरह दिखने के लिए एक साथ जोड़ देंगे (जो 0 है)। –

0

$((...)) निर्माण का उपयोग करें।

RESULT=`expr $RESULT + $?` 
RESULT=`dc -e "$RESULT $? + pq"` 

और केवल पार्टी में कुछ अन्य लोगों के:

RESULT=$((RESULT + $?)) 
RESULT=`bc <<< "$RESULT + $?"` 

वैसे भी, त्रुटि पर बाहर निकलने का दर्जा नहीं है हमेशा

$ cat st.sh 
RESULT=0 
true 
RESULT=$(($RESULT + $?)) 
false 
RESULT=$(($RESULT + $?)) 
false 
RESULT=$(($RESULT + $?)) 
echo $RESULT 
$ sh st.sh 
2 
$ 
1

यहाँ बैश या श में एक अतिरिक्त प्रदर्शन करने के लिए कुछ तरीके हैं 1 और इसका मान त्रुटि स्तर पर निर्भर नहीं है, इसलिए सामान्य स्थिति में थ्रेसहोल्ड के विरुद्ध स्थिति की जांच करने के लिए बहुत अधिक समझ नहीं है।

+0

मैं आपको अपने उत्तर के "हमेशा 1" भाग के लिए +1 नहीं दूंगा, लेकिन मैं नहीं करूँगा क्योंकि ए) आप $() और बी के बजाय वापस टिक का उपयोग करते हैं) expr bash में अनावश्यक है और 3) डीसी अतिरिक्त के लिए रास्ता overkill है। यदि ओपी बैश के बजाय sh का उपयोग कर रहा था (या यदि यह पोर्टेबिलिटी के लिए था) तो एक्सप्र और बैक टिक ठीक रहेगी। –

+0

... और डी) परिणाम क्यों नहीं है = 'बीसी <<<" $ RESULT + $? "'? –

+1

आपके परिशुद्धताओं के लिए धन्यवाद। उत्तर अपडेट किया गया। – mouviciel

-1

चूंकि मॉविसिक ने दावा किया है कि रिटर्न कोड एकत्रित करने के बजाय बेवकूफ़ दिखता है। शायद, आप गैर-शून्य परिणाम कोड जमा करने के लिए सरणी का उपयोग कर सकते हैं और इसकी लंबाई के खिलाफ जांच सकते हैं।इस दृष्टिकोण का उदाहरण नीचे है:

#!/bin/sh 

declare RESULT 
declare index=0 
declare ALLOWED_ERROR=1 

function write_result { 
    if [ $1 -gt 0 ]; then 
     RESULT[index++]=$1 
    fi 
} 

true 
write_result $? 

false 
write_result $? 

false 
write_result $? 

echo ${#RESULT[*]} 
if [ ${#RESULT[*]} -gt $ALLOWEDERROR ] 
    then echo "Too many errors" 
fi 
1

कैसे बैश में संख्याओं को जोड़ने के लिए यह भी देखें:

help let 
1

यदि आप अपनी स्क्रिप्ट में ALLOWEDERROR का उपयोग करना चाहते हैं, तो इसे $ $, उदाहरण $ ALLOWEDERROR के साथ पेश करें।

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