![쉘 스크립트(조건이 예상대로 작동하지 않는 경우)](https://linux55.com/image/97846/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8(%EC%A1%B0%EA%B1%B4%EC%9D%B4%20%EC%98%88%EC%83%81%EB%8C%80%EB%A1%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EA%B2%BD%EC%9A%B0).png)
일부 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"
여기서 중요한 점은 모든 변수에 대해 동일한 테스트를 수행하고 테스트가 실패하면 스크립트가 "모든 것이 정상입니다" 부분에 도달하지 않는다는 것입니다.