web-dev-qa-db-ja.com

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

スクリプトでファイルを丸め、ステータスコードを変数に入れたい(または少なくともステータスコードをテストできるようにしたい)

私はそれを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
Chris F Carroll
#!/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"
4
GMaster

--write-out&--writeを使用すると、次のようになります。

  url="https://www.gitignore.io/api/$1"
  tempfile=$(mktemp)
  if [[ -z $tempfile || ! -f $tempfile ]] ; then 
    echo "failed creating temp file" ; return 3
  fi
  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
0
Chris F Carroll