Добавить (собирать) коды выхода в bash

Мне нужно зависеть от нескольких отдельных исполнений в скрипте и не хочу связывать их в уродливом выражении «if». Я хотел бы взять код выхода « ALLOWEDERROR = 5 run_something RESULT = $ ? .. другие вещи .. run_something_else RESULT = $ RESULT + $ ? если [ $ РЕЗУЛЬТАТ - gt ALLOWEDERROR ], то эхо «Слишком много ошибок» fi каждого исполнения и добавьте его; в конце, если это значение превышает пороговое значение - я хотел бы выполнить команду.

Псевдокод:

trap

Проблема. Несмотря на то, что Интернет утверждает иначе, bash отказывается рассматривать RESULT и $? как целое. Каков правильный синтаксис?

Благодарю.

bash,scripting,shell,exit-code,

7

Ответов: 7


9 принят

Возможно, вы захотите взглянуть на 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

вы можете установить $? для таких ловушек:

ERR

Если вы считаете ошибки (и только тогда, когда они являются такими ошибками), как это, вместо использования « $?», вам не нужно беспокоиться о возвращаемых значениях, отличных от нуля или одного. Например, одно возвращаемое значение 127 приведет к немедленному переброске вас через ваш порог. Вы можете также зарегистрировать traps для других сигналов в дополнение к ERR.


13

Быстрый эксперимент и погружение в bash info говорит:

declare -i RESULT=$RESULT + $?

поскольку вы добавляете результат несколько раз, вы можете использовать declare в начале, например:

declare -i RESULT=0

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

echo $RESULT
2

который выглядит намного чище.

declare -i говорит, что переменная является целым числом.

В качестве альтернативы вы можете избежать объявления и использовать скобки для арифметических выражений:

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

1

Для того, чтобы добавить числа в Bash, см. Также:

help let 

1

Если вы хотите использовать ALLOWEDERROR в своем скрипте, представьте его с помощью $, например $ ALLOWEDERROR.


1

Вот несколько способов выполнить добавление в bash или sh:

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

И некоторые другие в bash только:

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

В любом случае, статус выхода при ошибке не всегда равен 1, и его значение не зависит от уровня ошибки, поэтому в общем случае нет смысла проверять сумму статусов от порога.

Баш, сценарии, оболочки, выход-код,
Похожие вопросы