저는 다음과 같은 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
qSHOWROOTS
0이 아닌 종료* 코드로 한 번만 실행해야 하는데 이는 좋은 일이므로 위에 표시된 것처럼 작성하는 것이 더 적절할 것이라고 생각했지만 shellcheck
전체 패닉이 나에게 알려줍니다.그냥 해야겠어if cmd;
대신에 출구가 0
or- 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 "$?"
작동할 것입니다.