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.

War es hilfreich?

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 traps 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top