조건부 'if' 명령이 else에서 응답하지 않습니다.

조건부 'if' 명령이 else에서 응답하지 않습니다.

관련 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이 실행되지 않으므로 문의 분기에 항상 도달할 수 없습니다.ncelseif

대신 다음 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실패합니다.

nc10초 후에 명령을 종료 하려면 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 $(( ! $? ))

관련 정보