programing

'if' 문을 사용하여 종료 상태를 확인하는 방법

abcjava 2023. 4. 21. 20:06
반응형

'if' 문을 사용하여 종료 상태를 확인하는 방법

종료 상태를 체크하는 가장 좋은 방법은 무엇입니까?if특정 출력을 에코하기 위한 스테이트먼트입니다.

저는 이렇게 생각하고 있습니다.

if [ $? -eq 1 ] 
then
    echo "blah blah blah"
fi

제가 또 안고 있는 문제는exit스테이트먼트는if단순히 출구 코드가 있어야 한다는 이유만으로 스테이트먼트를 작성할 수 있습니다.또한, 퇴출이 명백히 프로그램을 종료할 것이기 때문에 제가 뭔가 잘못하고 있다는 것을 알고 있습니다.

실행되는 모든 명령어에는 종료 상태가 있습니다.

이 체크는 해당 회선이 실행되기 전에 가장 최근에 종료된 명령어의 종료 상태를 확인하는 것입니다.

테스트가 true를 반환했을 때 스크립트를 종료하려면(이전 명령어가 실패했을 때)exit 1그 안에 (혹은) 무엇이든지if뒤를 막다echo.

즉, 명령어를 실행하고 있고 출력을 테스트하려면 다음 명령을 사용하는 것이 더 간단합니다.

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

또는 그것을 사용으로 되돌리기 위해!부정하기 위해

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

다만, 어느 쪽도 에러 코드의 내용에 대해서는 상관하지 않습니다.특정 에러 코드에만 관심이 있는 것을 알고 있는 경우는, 체크할 필요가 있습니다.$?수동으로 조작할 수 있습니다.

종료 코드 != 0은 오류를 보고하는 데 사용됩니다.따라서 다음 작업을 수행하는 것이 좋습니다.

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

대신

# will fail for error codes == 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal

명시적 표현에 대한 대안if진술

최소:

test $? -eq 0 || echo "something bad happened"

완료:

EXITCODE=$?
test $EXITCODE -eq 0 && echo "something good happened" || echo "something bad happened";
exit $EXITCODE

$?다른 파라미터와 같은 파라미터입니다.최종적으로 호출하기 전에 사용할 값을 저장할 수 있습니다.exit.

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status

참고로 스크립트가 다음과 같이 실행되는 경우set -e(또는#!/bin/bash -e이 때문에, 체크할 수 없습니다.$?(스크립트는 0 이외의 리턴 코드로 종료되기 때문에) 특정 코드를 처리하고 싶은 경우 @gboffis 코멘트는 매우 적합합니다.

/some/command || error_code=$?
if [ "${error_code}" -eq 2 ]; then
   ...

도움이 되는 상세 답변을 덧붙입니다.

종료 코드를 명시적으로 확인해야 하는 경우 산술 연산자를 사용하는 것이 좋습니다.(( ... )), 이 방법:

run_some_command
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }

또는,case스테이트먼트:

run_some_command; ec=$?  # grab the exit code into a variable so that it can
                         # be reused later, without the fear of being overwritten
case $ec in
    0) ;;
    1) printf '%s\n' "Command exited with non-zero"; exit 1;;
    *) do_something_else;;
esac

Bash에서의 오류 처리에 대한 관련 답변:

항상 바람직한 함수를 쓰는 경우 다음과 같이 오류를 전파할 수 있습니다.

function()
{
    if <command>; then
        echo worked
    else
        return
    fi
}

이제, 발신자는 다음과 같은 작업을 수행할 수 있습니다.function && next역시!이것은, 로 할 일이 많은 경우에 편리합니다.if블록 등(단, 한 줄의 줄도 있음)이 테스트에는,false명령어를 입력합니다.

Z사용(zsh는 간단히 과 같이 할 수 있습니다

if [[ $(false)? -eq 1 ]]; then echo "yes" ;fi

and Bash를 set -e 으면 됩니다.

false || exit_code=$?
if [[ ${exit_code} -ne 0 ]]; then echo ${exit_code}; fi

다음 if 문을 추가할 수 있습니다.

if [ $? -ne 0 ];
then
    echo 'The previous command was not executed successfully';
fi

이 기능은 제한된 사용 사례에서만 유용할 수 있습니다. 특히 명령어의 출력을 캡처하여 종료 코드가 문제가 있다고 보고하는 경우 로그 파일에 기록해야 할 때 사용합니다.

RESULT=$(my_command_that_might_fail)
if (exit $?) 
then
    echo "everything went fine."    
else
    echo "ERROR: $RESULT" >> my_logfile.txt
fi

해답이 빠져 '어울릴 수 없다'를 쓰는 예요.★★★★★★★★★★★★★★★★,&&★★★★★★★★★★★★★★★★★★:

command --with parameters && echo "Command completed succesfully"

----------------------------------command성공 시 0을 반환하고 실패 시 0이 아닌 것을 Bash가 예상한 대로 반환합니다(이는 많은 프로그래밍 언어와는 반대입니다).

||고장 시 연산자를 사용할 수 있습니다.

commamnd --with parameters || echo "Command failed"

다음 테스트 스크립트는 다음에 대해 동작합니다.

  • simple bash test 명령어
  • 다중 테스트 명령어
  • bash test 명령어에 파이프가 포함되어 있습니다.
if [[ $(echo -en "abc\n def" |grep -e "^abc") && ! $(echo -en "abc\n def" |grep -e "^def") ]] ; then
  echo "pipe true"
else
  echo "pipe false"
fi
if [[ $(echo -en "abc\n def" |grep -e "^abc") && $(echo -en "abc\n def" |grep -e "^def") ]] ; then
  echo "pipe true"
else
  echo "pipe false"
fi

출력은 다음과 같습니다.

pipe true
pipe false

언급URL : https://stackoverflow.com/questions/26675681/how-to-check-the-exit-status-using-an-if-statement

반응형