Pergunta

Eu preciso depender de algumas execuções separadas em um script e não quero empacotá-los todos em um feio 'if'. Eu gostaria de ter o código de saída '$? de cada execução e adicioná-lo; no final, se este valor for acima do limiar -. Gostaria de executar um comando

código Pseudo:

ALLOWEDERROR=5

run_something
RESULT=$?
..other things..

run_something_else
RESULT=$RESULT + $?

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

Issue: Mesmo que as reivindicações da Internet caso contrário, o bash se recusa a tratar o resultado e $? como um número inteiro. O que é a sintaxe correta?

Graças.

Foi útil?

Solução

Você pode querer ter um olhar para o builtin trap para ver se seria útil:

help trap

ou

man bash

Você pode definir uma armadilha para erros como este:

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

Se você contar os erros (e somente quando eles são erros) como este em vez de usar "$?", então você não precisa se preocupar com valores de retorno que são diferente de zero ou um. Um valor de retorno única de 127, por exemplo, iria jogá-lo sobre o seu limiar imediatamente. Você também pode registrar traps para outros sinais, além de ERR.

Outras dicas

A experiência rápida e mergulhar info bash diz:

declare -i RESULT=$RESULT + $?

desde que você está adicionando ao resultado várias vezes, você pode usar declarar no início, como este:

declare -i RESULT=0

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

echo $RESULT
2

que se parece muito mais limpo.

declare -i diz que a variável é inteiro.

Como alternativa, você pode evitar declarar e usar suportes de expressão aritmética:

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

Use a construção $(( ... )).

$ cat st.sh
RESULT=0
true
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
false
RESULT=$(($RESULT + $?))
echo $RESULT
$ sh st.sh
2
$

Para saber como adicionar números em Bash também ver:

help let 

Se você quiser usar ALLOWEDERROR em seu script, prefácio com a $, por exemplo $ ALLOWEDERROR.

Aqui estão algumas maneiras de realizar uma adição em bash ou sh:

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

E alguns outros na festa apenas:

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

De qualquer forma, status de saída em caso de erro não é sempre 1 e seu valor não depende do nível de erro, de modo que no caso geral não há muito sentido para verificar uma soma de estados contra um limiar.

Como mouviciel mencionado coleta soma de códigos de retorno parece um pouco sem sentido. Provavelmente, você pode usar matriz para acumular diferentes de zero códigos de resultado e cheque contra seu comprimento. Exemplo desta abordagem é a seguir:

#!/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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top