【问题标题】:Empty command output [duplicate]空命令输出[重复]
【发布时间】:2018-04-03 17:56:01
【问题描述】:

我正在编写一些 bash 脚本,并且想知道在 bash 脚本中运行命令时如何识别空输出或特定字符串输出。

示例 - 如果我对 google.com 执行 ping 操作,但由于没有连接,我收到消息“没有到主机的路由”,我希望程序回显“您已经完成了 boo boo”。

我尝试过的:

if [[ "$(ping -c 1 -n -q $address | grep -q 'ping: sendto: No route to 
host')" > /dev/null ]]; 
then echo " Your server is up and working, please proceed to the next 
step"
elif [-n "$(ping -c 1 -n -q $address | grep -q 'ping: sendto: No route 
to host')" == *java* ];
then echo "Your server is down, please fix this issue"
else 
echo "No response"
fi

另外,查看了实现此目的的其他方法,但找不到可行的解决方案。

【问题讨论】:

  • 管道将一个程序的标准输出连接到下一个程序的标准输入。错误消息不在标准输出上,它们在标准错误上。
  • 顺便说一句,我真的建议使用ip route 命令而不是ping 来测试配置错误的情况。现在,如果 OP 使用非英语的语言环境/翻译设置运行代码,您的代码将失败。
  • 你也可以这样if (nc -z google.com 80) then echo "working" else echo "not working" fi
  • @yausername 这似乎有效,谢谢 :))
  • if nc -z google.com 80; then ... 是上述版本的无意义低效版本。

标签: bash


【解决方案1】:

您可以查看grep 的退出状态。 grep 如果有匹配则退出 0。

if ! ping -c 1 -n -q $address 2>&1 | grep -q 'ping: sendto: No route to host' > /dev/null
then
    echo " Your server is up and working, please proceed to the next step"
fi

【讨论】:

  • (此外,当错误消息来自为人类编写的翻译表时,对错误消息进行 grepping 天生就容易出错。您不知道有人将在哪个语言环境中运行您的脚本 - - 如果您的No route to host 以除英文以外的任何内容打印,则此grep 将无法捕捉到它。
  • 顺便说一句,OP 的原始代码中还有一个流浪的)"
  • 我通常会检查ping本身的退出代码,但我认为它不够具体。
  • 同意,它不是——这就是为什么更好的方法是使用不同的工具来测试路由表,而不是尝试滥用pingiproute2 有一个专门用于手头任务的子命令。
猜你喜欢
  • 2018-11-04
  • 2018-07-05
  • 2021-04-24
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多