12

我需要依赖脚本中的几个单独的执行,并且不想将它们全部捆绑在一个丑陋的“if”语句中。我想使用退出代码“$?” 每次执行并添加它;最后,如果这个值超过阈值 - 我想执行一个命令。

伪代码:

ALLOWEDERROR=5

run_something
RESULT=$?
..other things..

run_something_else
RESULT=$RESULT + $?

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

问题:即使 Internet 声称并非如此,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

如果您像这样计算错误(并且仅当它们是错误时)而不是使用“ $?”,那么您不必担心返回值不是零或一。例如,单个返回值 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

正如 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 回答
0

以下是一些在 bash 或 sh 中执行加法的方法:

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

其他一些仅在 bash 中:

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

无论如何,错误退出状态并不总是 1,并且它的值不依赖于错误级别,因此在一般情况下,根据阈值检查状态总和没有多大意义。

于 2009-06-16T09:30:09.617 回答