检查 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。如果您 p​​ingIP而不是域。您应该尝试以下方法以获得所需的结果。

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

相关内容