4

バックアップ用のbashスクリプトを書いています。スクリプトはcurlを実行し、これにより特定のコードが返されます。

このコードの結果に応じて:

  • スクリプトは実行を継続する必要があります(戻りコードが200のように問題ない場合)または
  • スクリプトはnotokステータスを返し(リターンコードが400のようにokでない場合)、何もせずにスクリプトを終了する必要があります

カールからリターンをどのように読み取ることができますか?ほとんどの人にとっては簡単なスクリプトですが...;-)

4

3 に答える 3

10

問題

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ステータスコードはその範囲外です。

関連項目

于 2012-06-21T10:22:51.050 に答える
3
curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2
于 2012-10-19T18:36:51.003 に答える
1

デモを書きました。ステータスコードを出力できます。:)

#!/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}"
于 2012-06-21T09:37:30.773 に答える