나는 쉘 스크립트를 작성 중이고 다음을 통해 내 작업을 확인하기로 결정했습니다.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
재설정되므로 나중에 직접 실행 (또는 )하여 원래 종료 상태로 돌아갈 수 없습니다 . 무언가를 테스트하기 위해 재설정을 사용하는 경우에도 주의하세요 . 다른 변수에 할당하여 사용할 수도 있습니다.$?
printf
return "$?"
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 위키에서.