我正在编写一个 bash 脚本来 ping 给定的主机名,并显示主机是否处于活动状态(显示一条简单消息)。应该很容易,但却很头疼。以下是我目前所拥有的:
echo & echo "DOI (Domain):" &&read input
ip=$(ping -c 1 $input | gawk -F'[()]' '/PING/{print $2}')
if [ $? -eq 0 ]; then
echo "$ip is up";
else
echo "host is down";
fi
sleep 60
输出如下:
成功 ping(&回复),它响应:
74.125.226.119 is up
然而,当没有收到答复时它仍然会响应:
ping: unknown host google.ccccaa
is up
而不是回应“主机已关闭”
显然,我忽略了一些东西。我讨厌问这样的问题,我确信答案已经藏在这里的某个地方,但我又一次陷入了停滞,找不到我要找的东西。我甚至不确定我在找什么。
编辑:解决了!非常感谢您的帮助建议!
以下是最终版本:
echo & echo "DOI (Domain):" &&read input
output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}' 2>/dev/null )
echo "$input ($ip) is up";
else
echo "Host not found";
fi
sleep 60
答案1
首先,您应该添加2>/dev/null
到ping
调用中,以便错误消息ping
不会打印到标准错误。
其次,$?
在你的代码中不会包含你期望的结果,因为管道的返回状态是最后的命令,这gawk
在您的例子中是这样的,并且的退出状态ping
将被忽略。您可以重写代码,例如,如下所示:
output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}')
echo "$ip is up";
else
echo "host is down";
fi
答案2
我认为awk
没有必要。除非我遗漏了某些代码,否则应该可以解决问题:
#!/bin/bash
host=$1
ping -c1 $host > /dev/null 2> /dev/null
[[ $? == 0 ]] && echo "$host is up" || echo "$host is down/not reachable"
下面是一个例子:
$ ./checkping www.google.com
www.google.com is up
$ ./checkping www.google.utld
www.google.utld is down/not reachable