![如何转换 Bash 中 if 语句计数器请求的回显回复?](https://linux22.com/image/199274/%E5%A6%82%E4%BD%95%E8%BD%AC%E6%8D%A2%20Bash%20%E4%B8%AD%20if%20%E8%AF%AD%E5%8F%A5%E8%AE%A1%E6%95%B0%E5%99%A8%E8%AF%B7%E6%B1%82%E7%9A%84%E5%9B%9E%E6%98%BE%E5%9B%9E%E5%A4%8D%EF%BC%9F.png)
我正在尝试在 if 语句中使用 ping 命令,从 get go 开始将发送一定数量的请求,例如;ping -c 6 hostname
并认为这些数据包的声明成功if [ $result -gt 4]
,在一个有损链路例如,让它回来。
我或多或少已经弄清楚了,但只为每个命令发送单独的数据包(ping -c 1 hostname
),这需要更长的时间并且不能很好地反映连接状态。我发现了一个真正有趣的地方,通过管道grep
,wc
我可以将单词计算为整数,但它没有走那么远,不幸的是,它也只专注于单数据包测试。
写入文件是另一种方式,但我不想写入,即使它在下一个循环中被覆盖(这一切都将在循环中)并且永远不会真正增长。
我想做的是测试文件服务器是否可用;如果是安装它,如果不是则不要安装和尽快卸载失去连接的共享,这样系统就不会挂起或可能打开隧道。我设法用 AppleScript 和automountd
/来做到这一点autofs
,但我会使用 Bash 脚本 bc [1.] 这是我唯一的脚本语言有点理解并[2.]以小数据包批次快速、连续地进行测试,这样在切换回网络时可以有一定的余地以快速连接,或避免在切换出网络时挂起系统。
即使有更好的方法,我仍然想学习如何grep
从单个命令转换 ped 行以量化它们并在 if 语句中使用它们。
谢谢!
答案1
您想要测试是否至少收到了 6 个数据包中的 4 个,即是否存在严格小于 50% 的数据包丢失(6 个数据包中收到的 3 个数据包意味着 50% 的丢失)。
if ping -c 6 "$server" | awk -F, '/packet loss/ { exit !((0+$3) < 50) }'
then
printf 'Server "%s" is alive and returning more than 50%% of packets\n' "$server"
else
printf 'Server "%s" is in bad shape\n' "$server"
fi
该命令查看包含输出awk
中文本的行。在该行的第三个逗号分隔字段中,有一个数字,即数据包丢失百分比,我们通过在算术上下文中解释该字段(通过向其添加零)来获得该数字。我们退出代码时,其状态反映了数据包丢失是否严格低于 50%(零 = 是,非零 = 否)。packet loss
ping
awk
答案2
我会用来awk
计算成功回复的数量。
if ping -c6 "$server" | awk '/bytes from/ { k++ } END { exit !(k>=4) }'
then
echo OK
else
echo Dubious
fi
每条匹配的行bytes from
都会增加计数器k
。仅当退出状态为成功(零)时k >= 4