만약에!(...) 그리고;if[ $? -eq 0] (...)

만약에!(...) 그리고;if[ $? -eq 0] (...)

나는 쉘 스크립트를 작성 중이고 다음을 통해 내 작업을 확인하기로 결정했습니다.shellcheck.net. 내 스크립트에서 다음 두 줄을 사용하여 기능적으로 동일한 동작을 얻을 수 있었습니다.

findmnt /dev/sda1 >/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

그리고

if ! findmnt /dev/sda1 >/dev/null; then echo 0; else echo 1; fi

그러나 쉘체크던지다:

SC2181: $?를 간접적으로 사용하는 대신 "if mycmd;"를 사용하여 종료 코드를 확인하세요.

어느 것을 사용해야할지 잘 모르겠습니다. 나는 본다:https://github.com/koalaman/shellcheck/issues/1167이로 인해 몇 가지 가능한 값이 수정된 것 같습니다. 내가 작성하고 있는 내용이 모범 사례를 사용하여 문제 없이 실행되고 정확하게 보고되는지 확인하고 싶습니다.

답변1

$?다른 유틸리티에 대한 여러 호출에서 해당 값을 사용해야 하는 경우에만 특수 변수를 사용해야 합니다. 예를 들어 진단 메시지로 출력한 다음 함수에서 반환할 수 있습니다. 출력되는 내용은 종료 상태로 printf재설정되므로 나중에 직접 실행 (또는 )하여 원래 종료 상태로 돌아갈 수 없습니다 . 무언가를 테스트하기 위해 재설정을 사용하는 경우에도 주의하세요 . 다른 변수에 할당하여 사용할 수도 있습니다.$?printfreturn "$?"return[ ... ]$?$?

$?이것이 프로젝트의 나머지 부분에서 사용되는 스타일이라면 명령문에서 사용하는 것을 고려할 수 있습니다 . if이 경우 기술적으로 $IFS숫자가 포함될 수 있으므로 확장자를 인용하는 것을 기억하세요. 이는 인용되지 않은 확장자가 $?완전히 또는 부분적으로 사라질 수 있음을 의미합니다.

utility

# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
    echo ok
else
    echo fail
fi

그러나 이로 인해 많은 입력이 필요하고 코드가 다소 복잡해지고 이해하기가 다소 어려워집니다. 위의 호출은 그 뒤에 나오는 명령문과 직접적인 방식으로 연결 utility되지 않습니다 .if

if이제 문이 유틸리티의 종료 상태를 확인하여 [변수가 0인지 테스트하기 때문에 여기에는 약간의 추가 중복이 있습니다 . 이 변수는 다른 유틸리티의 종료 상태이며 if직접 사용할 수 있습니다.

if utility; then
    echo ok
else
    echo fail
fi

utility호출이 명령문의 필수적인 부분이라는 것은 여기서 분명합니다 if.

당신은 또한 볼 수 있습니다SC2181경고 이유ShellCheck 위키에서.

관련 정보