質問

スクリプト内のいくつかの別個の実行に依存する必要があり、それらをすべてい「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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top