首页 > 解决方案 > BASH 如果命令包含“此文本”,请执行另一个命令?

问题描述

我正在创建一个 bash 脚本来检查远程主机上的 HTTP 标头,我通过 cURL 执行此操作,并注意到附加 http://{host} 仅适用于在 tcp\80 上运行的服务,而不适用于 tcp\ 443. 例如,对于 HTTPS 服务,您需要 curl -I -k {host},而 HTTP 服务只需要 curl -I {host}。这是我的脚本:

for host in $(cat file.txt); do
echo " "
echo "Current host: "${host}
curl -I -k https://${host}
echo " "
echo "=============================================="
done

现在我想要的是一些条件运算符来检查如果输出是“无法解析主机”,那么脚本应该在那些标准输出包含 str 值的主机上运行“curl -I http://{host}” “无法解析主机”

如何在 bash 中实现这一点?

标签: bash

解决方案


stdout但不会包含Could not resolve host,这是输出到stderr. 虽然您可以捕获stderr然后进行字符串匹配,但有一个非常简单的解决方案:退出代码。

您可以在此处curl看到,当它无法解析主机时,它将始终以代码 6 退出。因此,只需测试退出代码就足够了:

curl -i -k http://nowaythisthingexists.test
if [[ $? -eq 6 ]]
then
    echo "oopsie, couldn't resolve host!"
fi

或者,如果您真的想通过匹配字符串来做到这一点,请确保将 stderr 重定向到 stdout (并且可能还杀死 stdout 以便它不会干扰):

output=$(curl -i -k http://nowaythisthingexists.test 2>&1 >/dev/null)
if [[ "$output" = *"Could not resolve host"* ]]
then
    echo "oopsie, couldn't resolve host!"
fi

显然,您不会以这种方式获得请求的输出,因此您需要将其重定向到比/dev/null文件或 Unix 管道更有用的地方。现在它变得比它需要的更复杂。


推荐阅读