Bash 脚本在执行测试之前检查 HTTP 状态

She*_*til 0 bash shell

您好,我尝试仅在应用程序启动并运行时执行特定测试(我正在使用 docker),我尝试在 bash 脚本的帮助下实现这一目标。我期望的是我需要运行一个循环,直到我从应用程序收到 200 状态,一旦我收到 200 脚本应该继续并执行测试。我正在尝试 bash 脚本,如下所示

#!/bin/bash
urlstatus=0
until [ $urlstatus -ne 200 ]; do
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "http://localhost:8000/animals")
echo $urlstatus
done
Run Code Online (Sandbox Code Playgroud)

如果应用程序已启动并正在运行,则执行测试

请让我知道脚本中缺少什么。

谢谢

Cha*_*ffy 5

-ne与您实际想要的测试完全相反;要循环直到退出状态为 200,您应该具有-eq,或者甚至更好(如果存在非数字值,以避免比较中出现错误消息),=

#!/bin/sh
fetchstatus() {
  curl \
    -o /dev/null \
    --silent \
    --head \
    --write-out '%{http_code}' \
    "http://localhost:8000/animals"
}

urlstatus=$(fetchstatus)          # initialize to actual value before we sleep even once
until [ "$urlstatus" = 200 ]; do  # until our result is success...
  sleep 1                         # wait a second...
  urlstatus=$(fetchstatus)        # then poll again.
done
Run Code Online (Sandbox Code Playgroud)

但由于curl可以调整其退出状态来指示请求是否成功,因此您甚至不需要它。使用--fail, 可以直接分支:

#!/bin/sh
while :; do
  curl -sS --fail -o /dev/null "http://localhost:8000/animals") && break
  sleep 1 # actually give your server a little rest
done
Run Code Online (Sandbox Code Playgroud)

&& break意味着只有当请求成功时我们才会跳出循环;curl 的参数--fail意味着只有服务器返回非错误的退出状态(例如 200),它才会返回成功。