Bash에서 종료 코드를 추가 (수집)하십시오
문제
스크립트에서 별도의 실행이 거의 없어야하며 추악한 '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