쉘 스크립트의 컬에서 HTTP 상태 코드와 콘텐츠를 모두 검색합니다.

쉘 스크립트의 컬에서 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

컬 7.76.0부터 추가 호출 없이 이를 수행할 수 있는 옵션이 있습니다.--몸과 함께 추락

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

요청이 400 이상의 HTTP 상태 코드를 반환하는 경우 Curl은 코드 22로 실패하지만 상태 코드에 관계없이 본문을 반환합니다.

관련 정보