조건에 명령을 포함해야 합니까, 아니면 반환 코드를 테스트해야 합니까?

조건에 명령을 포함해야 합니까, 아니면 반환 코드를 테스트해야 합니까?

이는 모범 사례에 대한 간단한 질문입니다. 어느 것을 사용해야 합니까?

옵션 1

ping -c1 "$host"

if [[ $? -eq 0 ]] ; then
   command
else
   command
fi

옵션 2

if ping -c1 "$host" ; then
   command
else
   command
fi

간단한 명령인 것은 알지만, 커지면 차이가 엄청날 수 있습니다.

답변1

선호의 문제이지만 하나를 추가할 계획이라면 두 번째 양식이 더 안전할 것입니다 set -e. 이 양식은 여전히 ​​예상대로 작동하지만 첫 번째 양식에서는 실패할 경우 스크립트가 즉시 종료됩니다 ping(0이 아닌 값으로). 종료 상태 반환).

참고: 연산자는 -eq, 가 아닙니다 eq.

답변2

옵션 2는 성공과 실패의 차이에만 관심이 있는 경우에만 선택할 수 있는 옵션입니다. 0이 아닌 다양한 종료 상태를 구별해야 하는 경우 옵션 1이 필요합니다.

some-command arg1 arg2
exit_status=$?
if [[ $exit_status -eq 0 ]]; then
   # ...
elif [[ $exit_status -eq 1 ]]; then
   # ...
elif [[ $exit status -eq 42 ]]; then
   # ...
else
   # ...
fi

( 첫 번째 명령에 의해 재설정되므로 다른 이름 $?으로 저장해야 하며 , 실패할 경우 첫 번째 명령에서는 동일한 값을 다시 테스트하지 않습니다 .)exit_status$?[[ ... ]]elif$?

글쎄요, 꼭 그렇지는 않아요필요한. 세 번째 옵션은 문을 사용하는 것입니다. 이 경우 해당 값을 다시 참조할 필요가 없는 경우 case저장할 필요가 없습니다 .$?

some-command arg1 arg2
case $? in
   0) # ...
   ;;
   1) # ...
   ;;
   42) # ...
   ;;
   *) # ...
   ;;
 esac

답변3

이해하기 어려워 보이지만 실제로는 일반적으로 사용되는 다음 Bash 관용구를 사용할 수 있습니다.

ping -c1 "$host" && command_success || command_failure

관련 정보