バックアップ用のbashスクリプトを書いています。スクリプトはcurlを実行し、これにより特定のコードが返されます。
このコードの結果に応じて:
- スクリプトは実行を継続する必要があります(戻りコードが200のように問題ない場合)または
- スクリプトはnotokステータスを返し(リターンコードが400のようにokでない場合)、何もせずにスクリプトを終了する必要があります
カールからリターンをどのように読み取ることができますか?ほとんどの人にとっては簡単なスクリプトですが...;-)
curlプログラムはシェルフレンドリーです。つまり、その終了ステータスは、HTTPステータスコードではなく、curlのステータスを反映します。
ステータスコードのURLを2回呼び出すか、書き込みフラグを使用してステータスコードを出力に追加するか、ヘッダーを解析できます。下記は用例です。
最初のオプションは、2つの別々の呼び出しを行うという点で単純であるため、ステータスコードは呼び出し間で同じではない可能性があります。それでも、場合によっては役立つ可能性があります。
# Make a second call to get the status code.
curl --verbose http://www.google.com 2>&1 |
sed -rn 's!^< HTTP/.* ([[:digit:]]+).*!\1!p'
これを行うためのより良い方法は、ステータスコードを標準出力に追加し、キャプチャした後にそれを取り除くことです。例えば:
response=$(curl --silent --write-out "\n%{http_code}\n" http://google.com)
status_code=$(echo "$response" | sed -n '$p')
html=$(echo "$response" | sed '$d')
上記の例を使用すると、これらの結果を好きなように使用できます。一例として、HTMLとステータスコードを別々に表示するには、次のようにします。
$ echo "$html"; echo; echo "HTTP Status Code: $status_code"
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
HTTP Status Code: 301
ステータスコードができたので、if/thenまたはcaseステートメントを使用して値に基づいて分岐できます。例えば:
case "$status_code" in
200) echo 'Success!'
;;
*) echo 'Fail!'
exit 1
;;
esac
独自の終了ステータスを設定する必要があり、HTTPステータスコードを再利用することはできないことに注意してください。シェルの終了ステータスは0〜255である必要があり、多くのHTTPステータスコードはその範囲外です。
curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\ -f2
デモを書きました。ステータスコードを出力できます。:)
#!/bin/bash
status_line=`curl -i stackoverflow.com 2>/dev/null | head -n 1`
status_code=`echo $status_line | awk '{print $2}'`
echo "STATUS_CODE: ${status_code}"