Hinzufügen (sammeln) Exit-Codes in bash
Frage
Ich brauche auf wenigen getrennten Ausführungen in einem Skript abhängen und nicht will, sie alle in einem hässlichen zu bündeln ‚if‘ Anweisung. Ich möchte den Exit-Code nehmen ‚$?‘ jeder Ausführungs hinzuzufügen; am Ende, wenn dieser Wert über einen Schwellenwert liegt -. würde Ich mag einen Befehl auszuführen,
Pseudo-Code:
ALLOWEDERROR=5
run_something
RESULT=$?
..other things..
run_something_else
RESULT=$RESULT + $?
if [ $RESULT -gt ALLOWEDERROR ]
then echo "Too many errors"
fi
Problem: Auch wenn das Internet das Gegenteil behauptet, bash weigert sich, das Ergebnis und $ zu behandeln? als ganze Zahl ist. Was ist die korrekte Syntax?
Danke.
Lösung
Sie können einen Blick auf die trap
builtin nehmen wollen, um zu sehen, ob es hilfreich wäre:
help trap
oder
man bash
Sie eine Falle für Fehler wie diese einstellen:
#!/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
Wenn Sie die Fehler zählen (und nur dann, wenn sie Fehler sind) wie folgt statt mit „$?
“, dann müssen Sie sich nicht um die Rückgabewerte sorgen, die andere sind als Null oder Eins. Ein einzelner Rückgabewert von 127, zum Beispiel, würden Sie über Ihre Schwelle sofort werfen. Sie können auch trap
s für andere Signale zusätzlich zu ERR
registrieren.
Andere Tipps
Ein kurzer Versuch und tauchen Sie ein in bash info sagt:
declare -i RESULT=$RESULT + $?
da man auf das Ergebnis mehrmals hinzufügen, können Sie zu Beginn verwenden erklären, wie folgt aus:
declare -i RESULT=0
true
RESULT+=$?
false
RESULT+=$?
false
RESULT+=$?
echo $RESULT
2
das sieht viel sauberer.
declare -i
sagt, dass die variable ganze Zahl ist.
Alternativ können Sie declare vermeiden und verwenden arithmetischen Ausdruck Klammern:
RESULT=$(($RESULT+$?))
Mit dem $(( ... ))
Konstrukt.
$ cat st.sh
RESULT=0
true
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
echo $RESULT
$ sh st.sh
2
$
Für wie Zahlen zu addieren, in Bash auch sehen:
help let
Wenn Sie ALLOWEDERROR in Ihrem Skript verwenden, Vorrede es mit einem $, z $ ALLOWEDERROR.
Hier sind einige Möglichkeiten, einen Zusatz in bash oder sh auszuführen:
RESULT=`expr $RESULT + $?`
RESULT=`dc -e "$RESULT $? + pq"`
Und einige andere in der Bash nur:
RESULT=$((RESULT + $?))
RESULT=`bc <<< "$RESULT + $?"`
Wie auch immer, Exit-Status bei einem Fehler nicht immer 1, und sein Wert hängt nicht von Fehlerniveau, so im allgemeinen Fall gibt es nicht viel Sinn, ist eine Summe von Zuständen mit einer Schwelle zu überprüfen.
Als mouviciel genannte Summe von Rückgabecodes sammeln eher sinnlos aussieht. Wahrscheinlich können Sie Array verwenden für Nicht-Null-Ergebnis-Codes Akkumulieren und überprüfen gegen seine Länge. Beispiel für diesen Ansatz ist unter:
#!/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