2009-06-16 16 views
7

私はスクリプトにいくつかの別々の実行に依存する必要があり、醜い 'if'ステートメントでそれらをすべてバンドルする必要はありません。私は終了コード '$?各実行の追加とそれを追加します。最後に、この値がしきい値を超えている場合 - 私はコマンドを実行したいと思います。bashで終了コードを追加(収集)

擬似コード:

ALLOWEDERROR=5 

run_something 
RESULT=$? 
..other things.. 

run_something_else 
RESULT=$RESULT + $? 

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

問題:インターネットはそう主張していても、bashの結果と$を治療することを拒否?整数として。正しい構文は何ですか?

ありがとうございました。

答えて

9

あなたはそれが参考になるかどうかを確認するために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 

あなたの代わりに「$?」を使用して、このようなエラーが(そして、彼らは、エラーの場合のみ)カウントした場合、その後、あなたが心配する必要はありません0または1以外の戻り値。たとえば、単一の戻り値127は、すぐにしきい値を超えてしまいます。 ERRに加えて、trapを他の信号に登録することもできます。

13

bashの情報への迅速な実験やディップは言う:

declare -i RESULT=$RESULT + $? 

あなたは結果に複数回追加されているので、あなたはこのように、開始時に宣言を使用することができます。

declare -i RESULT=0 

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

echo $RESULT 
2 

ましたはるかにきれいに見えます。

declare -iは、変数が整数であることを示します。

別の方法としては、declareを避け、算術式のブラケットを使用することができます。

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

最後のものは、エラー(または成功)に関係なく、実行された回数だけカウントされます。RESULT = $(($ RESULT + 1))。 $(())構文を使用する場合は、$?を追加する必要があります。 1の代わりに(Dave Hintonの答えのように)。それ以外の場合は、コマンドが0を返してもインクリメントされます。または、私の答えのようにトラップを使うことができます。 –

+1

ありがとう、私はあなたの修正で編集しました。私はあなたの答えが好きです。 –

+0

1つの行に-1の戻りコードがあり、別の行に1の戻りコードがある場合、それらは一緒になって成功(0)のように見えるため、これは機能しません。 –

0

$((...))構文を使用します。ここで

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

はbashやshの中で加算を行うためにいくつかの方法があります。

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

そして、いくつかの他のbashでのみ:

とにかく
RESULT=$((RESULT + $?)) 
RESULT=`bc <<< "$RESULT + $?"` 

、エラーの終了ステータスは、常にではありません1であり、その値はエラーレベルに依存しないので、一般的なケースでは、状態の合計をしきい値と比較することはあまり意味がありません。

+0

私はあなたの答えの "必ずしもそうではありません" 1の部分を+1しますが、a)$()の代わりにバックティックを使用し、b)exprはbashでは不要で、3)dc追加のための方法の過剰です。 OPがbashの代わりにshを使用していた場合(または移植性の場合)、exprとback tickはOKです。 –

+0

... d)なぜRESULT = 'bc <<<" RESULT + $? "'がありませんか? –

+1

この度はありがとうございます。回答が更新されました。 – mouviciel

-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 
1

help let 
1

スクリプトにALLOWEDERRORを使用する場合は、$ ALLOWEDERRORなどの$を前に付けます。

関連する問題