ファイルに変換し、状態コードを変数に入れる(または少なくとも状態コードをテストできるようにする)スクリプトが必要です。
たとえば、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
カール7.76.0以降、追加の呼び出しなしでこれを行うオプションがあります。- 体と一緒に転倒
curl -sI --fail-with-body $url
リクエストが 400 より高い HTTP ステータスコードを返す場合、Curl はコード 22 で失敗しますが、ステータスコードに関係なく本文を返します。