2009-06-16 26 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 

问题:即使在互联网声称否则,庆典拒绝治疗的结果,$?作为整数。什么是正确的语法?

谢谢。

回答

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 

如果算上误差(只有当他们是错误的)这样,而不是使用“$?”,那么你不必担心返回非零或一个值。例如,单个返回值127会立即将您置于阈值之上。除了ERR之外,您还可以为trap注册其他信号。

13

快速试验和浸入bash的信息说:

declare -i RESULT=$RESULT + $? 

,因为你要添加到结果几次,就可以使用声明的开始,像这样:

declare -i RESULT=0 

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

echo $RESULT 
2 

这看起来更干净。

declare -i说变量是整数。

或者可以避开声明和使用算术表达式括号:

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

最后一个只计算它被执行的次数,不管错误(或成功):RESULT = $(($ RESULT + 1))。如果你想使用$(())构造,你需要添加$?而不是1(正如Dave Hinton的回答)。否则,即使命令返回0,您也会增加。或者,您可以像我的回答中那样使用陷阱。 – 2009-06-16 19:09:53

+1

谢谢你,我修改了你的修改。我喜欢你的答案。 – 2009-06-16 23:56:36

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并且它的值不依赖于错误级别,所以在一般情况下,检查状态总和与阈值的关系是没有多大意义的。

-1

由于mouviciel提到收集返回代码的总和看起来相当毫无意义。可能你可以使用array来累加非零结果代码并检查它的长度。这种方法的例子如下:

#!/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

关于如何在Bash中添加数字还看到:

help let 
1

如果要在脚本中使用ALLOWEDERROR,请在其前面加上$,例如$ ALLOWEDERROR。