bash - 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 中实现这一点?
解决方案
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 管道更有用的地方。现在它变得比它需要的更复杂。
推荐阅读
- python - Python彩票生成器我试图弄清楚如何添加一个数字输入,并将它们分开并成为x数量的num long
- angular - Ag-grid + Angular 2:动态更改行节点中列的cellClass
- runtime - 运行时间和 theta 符号
- go - 为什么命令“go clean -n -r -i github.com/ethereum/go-ethereum...”不起作用?
- android - 混淆 API 是什么意思?
- c# - 自定义 ListViewItem 控件显示类名,其中常规 ListView 控件显示实际数据
- react-native - React-Native Redux Navigation 返回第一页 问题
- php - 在潜在客户模块中导出关系字段
- amazon-web-services - Ruby 捆绑控制台未从 ~/.aws/credentials 加载 aws 共享凭证
- c++ - 在立方体内画金字塔