12

スクリプト内のいくつかの個別の実行に依存する必要があり、それらすべてを醜い「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と$の扱いを拒否しますか?整数として。正しい構文は何ですか?

ありがとう。

4

7 に答える 7

17

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の単一の戻り値は、すぐにしきい値を超えます。trapに加えて、他の信号にsを登録することもできますERR

于 2009-06-16T18:57:26.700 に答える
17

簡単な実験とbash情報の詳細は次のとおりです。

declare -i RESULT=$RESULT + $?

結果に数回追加しているので、次のように最初に宣言を使用できます。

declare -i RESULT=0

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

echo $RESULT
2

ずっときれいに見えます。

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

または、宣言を避けて算術式ブラケットを使用することもできます。

RESULT=$(($RESULT+$?))
于 2009-06-16T09:21:43.613 に答える
2

$(( ... ))コンストラクトを使用します。

$ cat st.sh
RESULT=0
true
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
echo $RESULT
$ sh st.sh
2
$
于 2009-06-16T09:26:16.583 に答える
1

Bashで数値を追加する方法については、以下も参照してください。

help let 
于 2009-06-16T10:04:14.340 に答える
1

スクリプトでALLOWEDERRORを使用する場合は、先頭に$を付けます(例:$ ALLOWEDERROR)。

于 2009-06-16T19:18:37.930 に答える
0

bashまたはshで加算を実行するいくつかの方法は次のとおりです。

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

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

RESULT=$((RESULT + $?))
RESULT=`bc <<< "$RESULT + $?"` 

とにかく、エラー時の終了ステータスは常に1であるとは限らず、その値はエラーレベルに依存しないため、一般的なケースでは、ステータスの合計をしきい値と照合する意味はあまりありません。

于 2009-06-16T09:30:09.617 に答える
0

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
于 2009-06-16T09:55:48.803 に答える