bashで終了コードを追加(収集)します
質問
スクリプト内のいくつかの別個の実行に依存する必要があり、それらをすべてい「if」ステートメントにまとめたくありません。終了コード「$?」を取得したい各実行の追加と追加;最後に、この値がしきい値を超えている場合-コマンドを実行します。
擬似コード:
ALLOWEDERROR=5
run_something
RESULT=$?
..other things..
run_something_else
RESULT=$RESULT + $?
if [ $RESULT -gt ALLOWEDERROR ]
then echo "Too many errors"
fi
問題:インターネットが別の方法で主張しているとしても、bashはRESULTおよび$の処理を拒否しますか?整数として。正しい構文は何ですか?
ありがとう。
解決
組み込みの 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
を登録することもできます。
他のヒント
簡単な実験とbash情報の詳細:
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
$
Bashで数値を追加する方法については、次も参照してください。
help let
スクリプトでALLOWEDERRORを使用する場合は、$を先頭に付けます(例:$ ALLOWEDERROR)。
bashまたはshで追加を実行する方法は次のとおりです。
RESULT=`expr $RESULT + $?`
RESULT=`dc -e "$RESULT $? + pq"`
およびbashのみの一部:
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