현재 고급 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