관련 IP 및 포트와의 통신을 확인 1
하여 값을 반환해야 하는 다음 명령줄이 있습니다 .nc
/bin/nc -z 10.102.10.22 10003 > /dev/null && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
결과는 만족스러웠고 가치도 얻었습니다 1
. 그러나 해당 포트나 IP와 통신이 없으면 명령은 "대기" 상태가 되며 어떤 종류의 값도 얻지 못합니다.
특정 시간(예: 10초)이 경과한 후 0
값(문)을 반환하는 올바른 방법은 무엇입니까 ?else
이 명령의 결과는 매우 짧은 간격으로 모니터링되어 통신을 그래프로 표시하므로 언제인지 아는 것이 흥미롭습니다 0
.
답변1
성공적으로 완료된 경우에만 명령문을 실행하는 것 같습니다 if
.nc
nc ... && if ...
0
이는 출력되지 않는 이유를 설명합니다 . 실패 시 문 if
이 실행되지 않으므로 문의 분기에 항상 도달할 수 없습니다.nc
else
if
대신 다음 nc
을 직접 사용하세요 if
.
if nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
단락 논리를 사용하여 다음과 같은 특정 명령문을 작성할 수도 있습니다.
nc -z 10.102.10.22 10003 >/dev/null && echo 1 || echo 0
...하지만 기술적으로는 문과 동일하지 않습니다 if
. echo 0
다음 조건이 충족되면 마지막 명령이 실행됩니다.어느 하나 nc
아니면 echo 1
실패합니다.
nc
10초 후에 명령을 종료 하려면 GNU 유틸리티를 사용하십시오 timeout
.
if timeout 10 nc -z 10.102.10.22 10003 >/dev/null; then
echo 1
else
echo 0
fi
특수변수 $?
는거의 사용하지 않음. 하나 이상의 다른 명령을 실행한 후 명령의 종료 상태를 사용해야 하는 경우에만 필요합니다. 예를 들어, 어떤 경우에는 쉘 함수에서 종료 상태를 반환할 때:
myfunction () {
grep -q 'pattern' file
err=$?
if [ "$err" -ne 0 ]; then
echo failed >&2
fi
return "$err"
}
여기에서 [ ... ]
테스트하고 echo
재설정하세요 $?
.
답변2
&&
두 번째 부분은 첫 번째 부분이 true인 경우에만 적용 됩니다 . 그래서 당신이 가진 것은 이것입니다
nc
효과가 있었으니 실행if it suceeded
해 보세요.echo 1
nc
실패, 그러니 더 이상 넘어가지 마세요&&
내 생각에 당신이 원하는 것은 이것이다.
if nc -z 10.102.10.22 10003 > /dev/null; then echo 1; else echo 0; fi
답변3
다른 훌륭한 답변 외에도 원하는 결과는 종료 상태의 산술 부정이기도 합니다.
nc -z 10.102.10.22 10003 > /dev/null
echo $(( ! $? ))