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

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

일부 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

우선, [의 약어를 사용하고 있습니다 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"

여기서 중요한 점은 모든 변수에 대해 동일한 테스트를 수행하고 테스트가 실패하면 스크립트가 "모든 것이 정상입니다" 부분에 도달하지 않는다는 것입니다.

관련 정보