조건이 예상대로 작동하지 않는 경우 쉘 스크립트

조건이 예상대로 작동하지 않는 경우 쉘 스크립트

일부 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" 부분에 도달하지 않는다는 것입니다.

관련 정보