我现在正在阅读《高级 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
。如果您 pingIP
而不是域。您应该尝试以下方法以获得所需的结果。
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