web-dev-qa-db-ja.com

curlなどのコマンドがエラーなしで完了したかどうかを確認するにはどうすればよいですか?

Curlを使用して、HTTPポスト経由でサーバーにファイルをアップロードしています。

curl -X POST [email protected] server-URL

コマンドラインでこのコマンドを手動で実行すると、"Upload successful"のようなサーバーからの応答が返されます。ただし、このcurlコマンドをスクリプトで実行する場合、どうすればPOST要求が成功したかどうかを確認できますか?

24
Wes

最も簡単な方法は、応答を保存して比較することです。

$ response=$(curl -X POST [email protected] server-URL);
$ if [ "Upload successful" == "${response}" ]; then … fi;

私はそれをテストしていません。構文はずれているかもしれませんが、それはアイデアです。 curlの終了コードなどをチェックするなど、より洗練された方法があるはずです。

更新

curlは、かなりの数の終了コードを返します。投稿が失敗すると55 Failed sending network data.になる可能性があると思うので、$?Expands to the exit status of the most recently executed foreground pipeline.)と比較して、終了コードがゼロであることを確認できます。

$ curl -X POST [email protected] server-URL;
$ if [ 0 -eq $? ]; then … fi;

または、コマンドが比較的短く、失敗したときに何かを実行したい場合は、条件ステートメントの条件として終了コードを使用できます。

$ if curl --fail -X POST [email protected] server-URL; then
    # …(success)
else
    # …(failure)
fi;

私はこのフォーマット 多くの場合、推奨されます だと思いますが、個人的には読みにくくなっています。

21
user61786

最初に一度テストする必要がありますが、curl's --failオプションを使用できる場合もあります。

man curl

-f、--fail(HTTP)サーバーエラーでサイレントに(まったく出力しない)失敗します。これは主に、スクリプトなどが失敗した試行に適切に対処できるようにするために行われます。通常の場合、HTTPサーバーがドキュメントの配信に失敗すると、そのことを示すHTMLドキュメントが返されます(多くの場合、その理由も説明されています)。このフラグは、curlがそれを出力しないようにし、エラー22を返します。

          This method is not fail-safe and there are occasions where  non-
          successful  response  codes  will  slip through, especially when
          authentication is involved (response codes 401 and 407).

このようにして、あなたはただ行うことができます:

args="-X POST [email protected] server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"
23
mikeserv