シェルスクリプトでcurlからHTTPステータスコードとコンテンツの両方を取得する

シェルスクリプトでcurlからHTTPステータスコードとコンテンツの両方を取得する

ファイルに curl してステータス コードを変数に格納するスクリプトが必要です (または、少なくともステータス コードをテストできるようにします)

例えば、2回の呼び出しで実行できることがわかります。

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 で失敗しますが、ステータス コードに関係なく本文を返します。

関連情報