在 bash 脚本的 if 语句中使用 traceroute
Posted
技术标签:
【中文标题】在 bash 脚本的 if 语句中使用 traceroute【英文标题】:Using traceroute in an if statement in a bash script 【发布时间】:2019-03-08 18:00:34 【问题描述】:我正在尝试根据 traceroute 是否从特定 IP 地址获得响应来执行代码。所以:
if traceroute 123.456.78.9
then
option 1
else
option 2
我的问题是,无论我是否从 IP 地址得到响应,选项 1 总是被执行。
我已经尝试使用 'ping' 而不是 traceroute 并且它有效,但我没有在最终代码中使用 ping 的选项。
更多详情:
-
在 QNX 操作系统上运行
成功由主机响应构成,失败由主机无响应构成
成功输出:
traceroute to 123.456.78.9 (123.456.78.9), 1 hops max, 40 byte packets
1 123.456.78.9 (123.456.78.9) 0.000 ms 1.000 ms 0.000 ms
失败输出:
traceroute to 123.456.78.90 (123.456.78.90), 1 hops max, 40 byte packets
1 *
【问题讨论】:
运行traceroute 123.456.78.9
,然后echo $?
检查退出状态。如果是0
,则视为成功。如果是1
,则视为失败。
如果 traceroute 在退出时总是报告成功,即使它无法到达远程系统,请向您的操作系统供应商提出 - 他们是为您提供 traceroute 的人;它不是 bash 的一部分。 OTOH,如果您想读取 traceroute 的标准输出并从那里确定成功或失败,我们可以这样做,但是您需要在您的问题中提供 much 更多信息(特别是成功的示例输出和失败案例,以及您期望构成失败的详细信息)。如果没有这些详细信息,答案可能只能在回答者运行的操作系统上运行。
感谢您的回复。我根据您的评论添加了更多详细信息。另外,我不确定如何使用上面提到的 echo $ 检查退出状态。
echo $?
。 ?
是其中的一部分。比较 true; echo $?
和 false; echo $?
。您会看到前者为 0(退出状态,if
和其他条件将视为成功),后者为 1(与任何其他非零值一样,被视为失败)。
【参考方案1】:
问题是即使没有有效的主机,traceroute 总是会回显输出,因此您需要先检查有效响应
您必须检查是否收到了有效的响应
尝试使用
n=`traceroute 123.456.78.9|grep ms|wc|sed 's/ //g' |cut -d ' ' -f 1`
if [ $n -eq 0 ]
then
echo 'failed'
else
echo 'success'
fi
【讨论】:
如果ms
只能在成功案例中找到,那不就是if traceroute 123.456.78.9 | grep -q ' ms'; then echo success; else echo failed; fi
吗?管道似乎有点矫枉过正。
(另外,正如shellcheck.net 所指出的,最好引用扩展,如[ "$n" -eq 0 ]
;这样,如果你以某种方式最终得到n
的空值,你会得到一个来自test
的更有用的错误消息)。
感谢您的改进以上是关于在 bash 脚本的 if 语句中使用 traceroute的主要内容,如果未能解决你的问题,请参考以下文章
在 if elif else 语句中具有逻辑与和 ors 的 Bash 脚本