종료 코드가 여러 개인 경우 Bash if 문에서 종료 코드를 간접적으로 확인할 수 있습니까?

종료 코드가 여러 개인 경우 Bash if 문에서 종료 코드를 간접적으로 확인할 수 있습니까?

저는 다음과 같은 Bash 스크립트를 작성하고 있습니다.

  qSHOWROOTS; if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 3 ]; then
    ncxy 0 "$vpos_l"; prin…
  fi

qSHOWROOTS0이 아닌 종료* 코드로 한 번만 실행해야 하는데 이는 좋은 일이므로 위에 표시된 것처럼 작성하는 것이 더 적절할 것이라고 생각했지만 shellcheck전체 패닉이 나에게 알려줍니다.그냥 해야겠어if cmd;대신에 출구가 0or- 1어디에 있는지 확인하는 것으로 제한됩니다 255. 그렇죠? 무시해도 되나요? 아니면 다른 방법을 찾아야 합니까?

감사해요!

답변1

$?마지막 명령의 종료 상태로 확장됩니다.

if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]

두 번째 [명령을 실행할 때(첫 번째 명령이 [실패했다고 가정) 간단히 첫 번째 명령의 종료 상태( [1)를 확인할 수 있습니다.

여기서는 다음을 선언해야 합니다 case.

qSHOWROOTS
case $? in
  (1) something;;
  (2) something else;;
  ...
  (*) anything else
esac

$?한 번만 확장됩니다 .

명령문을 사용해야 하는 경우 종료 상태를 별도의 변수에 if저장해야 합니다 .qSHOWROOTS

qSHOWROOTS; ret=$?
if [ "$ret" -eq 1 ]; then
  something
elif [ "$ret" -eq 2 ]; then
  something else
...
else
  anything else
fi

shellcheck [ $? -eq 0 ]객체를 다음에서 가끔 볼 수 있는 것으로 변환합니다.

cmd
if [ $? -eq 0 ]

존재하다스타일지면.

이는 명령을 실행하는 [것이므로 이전 명령이 true를 반환하면 [성공을 직접 확인하는 대신 true를 반환하고 성공을 확인합니다 cmd. 이는 다소 어리석은 일입니다. 당신은 쓸 수 있습니다: if cmd; then....

현재 버전의 shellcheck는 누락된 따옴표를 보고하지 않습니다. $?그러나 이는 잘못된 코딩 관행이자 버그입니다. 코드는 $IFS숫자가 포함되지 않은 컨텍스트에서만 제대로 작동하기 때문입니다.

[ "$?" -eq 0 ]command() 인수의 목록 컨텍스트에 있기 때문에 분할+glob을 방지 해야 합니다 [. 에서는 case $?목록 컨텍스트에 있지 않으므로 따옴표가 필요하지 않지만 문제가 되지는 않습니다. case "$?"작동할 것입니다.

관련 정보