스크립트를 파일로 변환하고 상태 코드를 변수에 넣기를 원합니다(또는 적어도 상태 코드를 테스트할 수 있도록)
예를 들어 두 번의 통화로 할 수 있다는 것을 알 수 있습니다.
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로 실패하지만 상태 코드에 관계없이 본문을 반환합니다.