请求排查丢包率判断脚本异常:主机响应时变量值为空
问题原因与修复方案
问题根源
你的脚本依赖固定字段位置提取丢包率,但ping命令在**主机正常响应(0%丢包)和完全丢包(100%丢包)**时的结尾统计行格式存在差异,导致固定取第7个字段的逻辑失效:
- 当完全丢包时,统计行里的丢包率刚好落在第7个字段位置,所以能正确提取到
100; - 当主机正常响应时,丢包率所在的字段位置不是第7位,脚本取到的是无关内容(甚至为空,如果该字段不存在),最终变量
a无法得到预期的0。
举个例子,多数Linux系统的ping输出:
- 完全丢包时的统计行:
10 packets transmitted, 0 received, 100% packet loss, time 9012ms
丢包率100%是第6个字段 - 正常响应时的统计行:
10 packets transmitted, 10 received, 0% packet loss, time 9008ms
丢包率0%同样是第6个字段
你的脚本取第7个字段,正常时会拿到packet这个无关字符串,经过sed处理后还是packet,后续和数字70比较时会出错,最终表现为变量a不符合预期。
修复后的脚本
不要依赖固定字段位置,改用内容匹配提取丢包率:
# 直接提取包含%的丢包率数字部分 a="$(ping -c10 "host" | awk '/packet loss/ {gsub(/%/,"",$6); print $6}')" b=70 if [ "$a" -gt "$b" ]; then echo "trouble ping" # 这里替换成重启调制解调器的命令 else echo "ping ok" fi
修复逻辑说明
- 用
awk '/packet loss/'精准定位到包含丢包率的统计行; - 用
gsub(/%/,"",$6)去掉第6个字段里的%符号(根据你的ping输出调整字段号,比如如果实际是第7个就改$7); - 直接提取处理后的数字,无论丢包率是0%还是100%,都能正确获取数值。
验证方法
手动执行ping -c10 host,观察统计行里丢包率所在的字段位置,调整脚本中的$6为对应字段号即可。
内容的提问来源于stack exchange,提问作者December EveryDay
相关产品推荐
相关产品推荐

