
이는 모범 사례에 대한 간단한 질문입니다. 어느 것을 사용해야 합니까?
옵션 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