سؤال

وأحتاج إلى الاعتماد على عدد قليل من الإعدام منفصلة في السيناريو ولا تريد أن تضعهم جميعا في قبيحة 'إذا' البيان. وأود أن تأخذ رمز إنهاء '$؟ كل التنفيذ وإضافته. في النهاية، إذا كانت هذه القيمة أكثر من عتبة - أود أن تنفيذ أمر

ورمز زائف:

ALLOWEDERROR=5

run_something
RESULT=$?
..other things..

run_something_else
RESULT=$RESULT + $?

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

العدد: على الرغم من أن الإنترنت يدعي خلاف ذلك، يرفض باش لعلاج النتيجة و$؟ كما صحيح. ما هو بناء الجملة الصحيح؟

وشكرا.

هل كانت مفيدة؟

المحلول

وقد ترغب في إلقاء نظرة على المضمن trap لمعرفة ما اذا كان سيكون من المفيد:

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، على سبيل المثال، فإن رمي لك أكثر من عتبة على الفور. يمكنك أيضا تسجيل traps عن إشارات أخرى بالإضافة إلى ERR.

نصائح أخرى

وتجربة سريعة وتراجع إلى معلومات باش يقول:

declare -i RESULT=$RESULT + $?

ومنذ كنت مضيفا إلى النتيجة عدة مرات، يمكنك استخدام تعلن في البداية، مثل هذا:

declare -i RESULT=0

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

echo $RESULT
2

والتي تبدو أنظف بكثير.

وdeclare -i يقول أن المتغير هو عدد صحيح.

وبدلا من ذلك يمكنك تجنب تعلن واستخدام الأقواس التعبير الحسابية:

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

استخدم في بناء $(( ... )).

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

لكيفية إضافة أرقام في باش انظر أيضا:

help let 

إذا كنت تريد استخدام ALLOWEDERROR في السيناريو الخاص بك، أستهل ذلك مع $، منها مثلا $ ALLOWEDERROR.

وهنا بعض الطرق لإجراء إضافة في سحق أو ش:

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

والبعض الآخر في باش فقط:

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

وعلى أي حال، وحالة الخروج على خطأ ليس دائما 1 و لا تعتمد قيمته على مستوى الخطأ، وذلك في حالة عامة ليس هناك معنى كبير للتحقق من مجموع الحالات ضد العتبة.

وكما ذكر mouviciel جمع مبلغ من رموز الإرجاع تبدو لا معنى لها إلى حد ما. ربما، يمكنك استخدام مجموعة لتجميع رموز نتيجة غير صفرية وتحقق ضد طوله. مثال على هذا النهج هو التالي:

#!/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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top