Bash 스크립트에서 명령 결과 확인

Bash 스크립트에서 명령 결과 확인

현재 고급 Bash 스크립팅 가이드를 읽고 있습니다. 내 컴퓨터에서 제대로 작동하지 않는 일부 스크립트가 있습니다.

HNAME=news-15.net # Notorious spammer.
# HNAME=$HOST
# Debug: test for localhost.
count=2 # Send only two pings.
if [[ `ping -c $count "$HNAME"` ]]
then
echo ""$HNAME" still up and broadcasting spam your way."
else
echo ""$HNAME" seems to be down. Pity."
fi

$HNAME" still up and broadcasting spam your way.IP 주소가 존재하지 않는 경우에도 항상 인쇄됩니다 . 누군가 문제가 무엇인지 명확히 할 수 있습니까?

IP 주소 대신 호스트 이름을 사용하면 제대로 작동합니다.

답변1

if [[ `ping -c $count "$HNAME"` ]]

이는 ping명령 대체에서 작동합니다( saner가 아닌 이전 백틱 구문 사용 $(...)). 생성된 출력을 명령줄에 넣고 [[ .. ]]출력이 비어 있는지 테스트합니다. (즉, 일반 출력입니다. 명령 대체는 스크립트의 오류 출력으로 계속 전송되는 오류 출력을 캡처하지 않습니다.)

아무것도 출력되지 않으면 ping테스트가 성공한 것입니다. 내 시스템의 예를 들면 다음과 같습니다.

$ ping -c1 1.2.3.4 2>/dev/null
PING 1.2.3.4 (1.2.3.4) 56(84) bytes of data.

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

1.2.3.4유효한 IP 주소이므로 접속 ping해 보세요. IP 주소가 유효하지 않거나 호스트 이름이 존재하지 않으면 오류만 인쇄하고 표준 출력은 비어 있습니다.

호스트가 시작되는지 테스트하는 더 좋은 방법은 종료 상태를 테스트 ping하고 출력을 리디렉션하는 것입니다.

host=1.2.3.4
if ping -c1 "$host" >/dev/null 2>&1; then
    echo "'$host' is up"
else
    echo "'$host' does not respond (or invalid IP address/hostname)"
fi

명령의 따옴표는 echo닫혀 있습니다.

echo ""$HNAME" seems to be down."

여기에는 인용된 빈 문자열 "", 인용되지 않은 매개변수 확장 $HNAME, 인용된 문자열이 있습니다 " seems to be down.". 여러 가지 이유로 모든 인수 확장을 인용하는 것이 가장 좋습니다. 따라서 출력에서 ​​변수 주위에 인용 부호를 추가하려면 "$var blahblah"또는 를 사용하세요."\"$var\" blahblah"

바라보다:

답변2

귀하의 질문에서 언급했듯이 even with nonexistent ip. IP도메인 대신 ping을 하는 경우 . 원하는 결과를 얻으려면 다음 방법을 시도해야 합니다.

HNAME=192.168.1.21 
count=2 # Send only two pings.
if ping -c $count "$HNAME" 2> /dev/null
then
    echo "\"$HNAME\" still up and broadcasting spam your way."
else
    echo "\"$HNAME\" seems to be down. Pity."
fi

관련 정보