문제

스크립트에서 별도의 실행이 거의 없어야하며 추악한 'IF'진술에 모두 묶고 싶지 않습니다. 출구 코드 '$?' 각각의 실행 및 추가; 결국,이 값이 임계 값을 초과하면 명령을 실행하고 싶습니다.

의사 코드 :

ALLOWEDERROR=5

run_something
RESULT=$?
..other things..

run_something_else
RESULT=$RESULT + $?

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

발행 : 인터넷이 그렇지 않으면 Bash는 결과와 $ 치료를 거부합니까? 정수로. 올바른 구문은 무엇입니까?

감사.

도움이 되었습니까?

해결책

당신은 그것을보고 싶을 것입니다 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.

다른 팁

빠른 실험과 Bash 정보에 담그는 것은 다음과 같습니다.

declare -i RESULT=$RESULT + $?

결과를 여러 번 추가하므로 처음에는 다음과 같이 선언을 사용할 수 있습니다.

declare -i RESULT=0

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

echo $RESULT
2

훨씬 깨끗해 보입니다.

declare -i 변수는 정수라고 말합니다.

또는 산술 표현 괄호를 선언하고 사용할 수 있습니다.

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

사용 $(( ... )) 건설하다.

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

Bash에 숫자를 추가하는 방법은 다음을 참조하십시오.

help let 

스크립트에서 허용 기러기를 사용하려면 $, eg $ allenderRor로 서문하십시오.

Bash 또는 SH에서 추가를 수행하는 몇 가지 방법은 다음과 같습니다.

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

그리고 Bash의 다른 사람들은 다음과 같습니다.

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

어쨌든, 오류의 종료 상태는 항상 1이 아니며 그 값은 오류 수준에 의존하지 않으므로 일반적인 경우 임계 값에 대해 상태의 합을 확인할 수는 없습니다.

Mouviciel이 언급 한 바와 같이, 반환 코드의 합계는 다소 무의미해 보입니다. 아마도 0이 아닌 결과 코드를 축적하기 위해 배열을 사용하고 길이를 확인할 수 있습니다. 이 접근법의 예는 다음과 같습니다.

#!/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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top