linux 如何使这个bash脚本更短更好?有没有办法在bash中合并多个curl语句和if语句?

6ss1mwsb  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(139)
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的名称?

pbgvytdp

pbgvytdp1#

有没有办法在bash中合并多个curl语句和if语句?
curl可以在一次运行中检索多个URL,但是您需要将其输出解析为每个URL的片段。由于您希望报告每个URL的响应,因此为每个URL单独运行curl可能会对您有利。
但是,您可以通过编写一个shell函数来执行一次curl运行并报告结果,从而减少脚本的重复性:

test_url() {
  local status=$(curl -o /dev/null -s -w "%{http_code}\n" -H "Authorization: token abc123" "$1")

  if [ "$status" = 200 ]; then
    echo "$2 is running successfully"
  else
    echo "Error at $2. Status code: $status"
  fi
}

然后,为给定的URL运行它是一行代码:

test_url https://url_1.com url1_1
test_url https://url_2.com url1_2

总的来说,这也和原始的长度差不多,但是这是长度上的平衡点。每个要测试的特定URL只需要一行,而在您的版本中是六行。另外,如果您想更改查找或状态报告的任何细节,那么您可以在一个地方对所有内容进行更改。

qq24tv8q

qq24tv8q2#

为了避免重复,您可以封装需要在函数中重复使用的代码。

httpresult () {
    curl -o /dev/null -s -w "%{http_code}\n" -H "Authorization: token abc123" "$@"
}

check200 () {
    local status=$(httpresult "$1")
    if [ "$status" = "200" ]; then
        echo "$0: ${2-$1} is running successfully" >&2
    else
        echo "$0: error at ${2-$1}. Status code: $status" >&2
    fi
}

check200 "https://url_1.com/" "url_1"
check200 "https://url_2.com/" "url_2"

httpresult拆分为一个单独的函数并不是真正必要的,但是作为一个更加模块化的设计的演示,以及作为您也可以在其他脚本中重用的东西,可能都是有用的。
我更改了状态消息的格式,以便在消息中包含脚本的名称,并根据常见的最佳实践将诊断结果打印到标准错误而不是标准输出。
check200函数接受一个URL和一个人类可读的标签(可选),以便在诊断消息中使用;如果您省略了它,它们也只会包含URL。从您的问题中,我们并不清楚这些标签是否重要和有用。
请注意,[ ... ]中的标准比较运算符是=,而不是==(尽管Bash会接受两者)。

相关问题