Status_code_1=$(curl -o /dev/null -s -w "%{http_code}\n" -H "Authorization: token abc123" https://url_1.com)
Status_code_2=$(curl -o /dev/null -s -w "%{http_code}\n" -H "Authorization: token abc123" https://url_2.com)
if [ $Status_code_1 == "200" ]; then
echo "url_1 is running successfully"
else
echo "Error at url_1. Status code:" $Status_code_1
fi
if [ $Status_code_2 == "200" ]; then
echo "url_2 is running successfully"
else
echo "Error Error at url_2. Status code:" $Status_code_2
fi
主脚本被调度并每天运行,每次都打印成功消息。如果状态代码不是200,则$Status_code_1或$Status_code_2中的任一个都将打印错误代码。
代码运行的很好,但是我想知道如何能把它缩短。前两行的curl命令可以合并吗,因为它们有相同的授权和所有的东西,只是末尾的url不同。后面的if语句也差不多,只是我对不同的url分别运行它们。
有没有可能把前两行写在一行中,并且两个if语句都是一样的?我知道AND和OR可以用于if语句,但是假设我们有5个url,其中2个是down,在这种情况下,它将如何打印这2个url的名称?
2条答案
按热度按时间pbgvytdp1#
有没有办法在bash中合并多个curl语句和if语句?
curl
可以在一次运行中检索多个URL,但是您需要将其输出解析为每个URL的片段。由于您希望报告每个URL的响应,因此为每个URL单独运行curl
可能会对您有利。但是,您可以通过编写一个shell函数来执行一次
curl
运行并报告结果,从而减少脚本的重复性:然后,为给定的URL运行它是一行代码:
总的来说,这也和原始的长度差不多,但是这是长度上的平衡点。每个要测试的特定URL只需要一行,而在您的版本中是六行。另外,如果您想更改查找或状态报告的任何细节,那么您可以在一个地方对所有内容进行更改。
qq24tv8q2#
为了避免重复,您可以封装需要在函数中重复使用的代码。
将
httpresult
拆分为一个单独的函数并不是真正必要的,但是作为一个更加模块化的设计的演示,以及作为您也可以在其他脚本中重用的东西,可能都是有用的。我更改了状态消息的格式,以便在消息中包含脚本的名称,并根据常见的最佳实践将诊断结果打印到标准错误而不是标准输出。
check200
函数接受一个URL和一个人类可读的标签(可选),以便在诊断消息中使用;如果您省略了它,它们也只会包含URL。从您的问题中,我们并不清楚这些标签是否重要和有用。请注意,
[ ... ]
中的标准比较运算符是=
,而不是==
(尽管Bash会接受两者)。