Ich möchte ein Skript, das eine Datei erstellt und den Statuscode in eine Variable einfügt (oder mir zumindest ermöglicht, den Statuscode zu testen).
Ich sehe, dass ich es in zwei Anrufen erledigen kann, z. B.
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 ...
aber vermutlich gibt es eine Möglichkeit, den redundanten zusätzlichen Anruf zu vermeiden?
$?
hilft nicht: Statuscode 404 bringt immer noch einen Returncode von 0
Antwort1
#!/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"
(Es gibt auch andere Möglichkeiten, z. B. --write-out
eine temporäre Datei. In meinem Beispiel muss ich jedoch nicht auf die Festplatte zugreifen, um eine temporäre Datei zu schreiben und daran denken, sie zu löschen; alles wird im RAM erledigt.)
Antwort2
Durch die Verwendung von --write-out und einer temporären Datei gelange ich zu:
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
Antwort3
Seit curl 7.76.0 gibt es eine Option, dies ohne den zusätzlichen Aufruf zu tun,--mit-Körper-fallen
curl -sI --fail-with-body $url
Curl schlägt mit Code 22 fehl, wenn die Anforderung einen HTTP-Statuscode über 400 zurückgibt, gibt den Text jedoch unabhängig vom Statuscode zurück.