在 shell 脚本中从 curl 检索 HTTP 状态代码和内容

在 shell 脚本中从 curl 检索 HTTP 状态代码和内容

我想要一个脚本卷曲到一个文件并将状态代码放入变量中(或者至少使我能够测试状态代码)

我可以看到我可以通过两次电话来完成,例如

url=https://www.gitignore.io/api/nonexistentlanguage
x=$(curl -sI $url | grep HTTP | grep -oe '\d\d\d')
if [[ $x != 200  ]] ; then
  echo "$url SAID $x" ; return
fi
curl $url # etc ...

但大概有一种方法可以避免多余的额外调用?

$?没有帮助:状态代码 404 仍然得到返回代码 0

答案1

#!/bin/bash

URL="https://www.gitignore.io/api/nonexistentlanguage"

response=$(curl -s -w "%{http_code}" $URL)

http_code=$(tail -n1 <<< "$response")  # get the last line
content=$(sed '$ d' <<< "$response")   # get all but the last line which contains the status code

echo "$http_code"
echo "$content"

(还有其他方法,例如--write-out临时文件。但我的示例不需要触摸磁盘来写入任何临时文件并记住删除它;一切都在 RAM 中完成)

答案2

使用 --write-out 和临时文件让我:

  url="https://www.gitignore.io/api/$1"
  tempfile=$(mktemp)

  code=$(curl -s $url --write-out '%{http_code}' -o $tempfile)

  if [[ $code != 200  ]] ; then
    echo "$url SAID $code"
    rm -f $tempfile
    return $code
  fi
  mv $tempfile $target

答案3

从curl 7.76.0开始,有一个选项可以在不需要额外调用的情况下执行此操作,--与身体一起坠落

curl -sI --fail-with-body $url

如果请求返回任何高于 400 的 HTTP 状态代码,Curl 将失败并返回代码 22,但无论状态代码如何,都会返回正文。

相关内容