
일부 Linux 명령을 실행하고 if 절에서 예외를 캡처하여 결과를 출력하는 스크립트를 작성했습니다. 기본적으로 아래 코드에서 발췌한 각 변수는 명령 실행 상태를 나타내며 모든 명령이 성공적으로 실행되면 스크립트를 성공적으로 종료하고 싶습니다. 그렇지 않으면 나는 하나를 종료하고 싶습니다. 명령 실패 시 의도적으로 만든 스크립트를 테스트하는 동안 X8과 같은 한 변수의 출력은 1입니다. 이 시나리오에서는 아래가 예상대로 작동하지 않습니다. 스크립트 실패 메시지 대신 성공 메시지가 표시됩니다. 이유가 확실하지 않음
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
답변1
스크립트 상단에 다음을 추가하세요.
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
그런 다음, 잡히지 않는 오류가 발생할 때마다 스크립트는 위의 메시지와 함께 보석금을 내고 오류 종료 코드와 함께 종료됩니다. 오류에 대해 종료 코드 1을 사용하려면 $?
으로 변경할 수 있습니다 .1
답변2
우선, 당신은 [
의 약칭인 which 를 사용하고 있습니다 test
. 에서 man test
:
STRING1 != STRING2 the strings are not equal
작업에 잘못된 도구를 사용하고 있습니다. 당신에게 필요한 것은
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
둘째, 여기에서 테스트할 여러 조건이 있습니다. 하나의 긴 if 문을 사용하는 대신 glenn이 주석에서 제안한 대로 각 변수의 출력을 합산하고 테스트해 보세요. 또는 각 명령이 존재한 직후의 출력을 평가하십시오. 어쨌든 해당 명령의 출력 때문에 종료하려는 경우 다른 명령을 실행할 필요가 없습니다.
루핑 접근 방식은 다음과 같습니다.
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
여기서 중요한 점은 모든 변수에 대해 동일한 테스트를 수행하고 해당 테스트가 실패하면 스크립트가 "Everything OK" 부분에 도달하지 않는다는 것입니다.