私は以下のようにスクリプト化しました:-(編集)
httpUrl="http://www.nnin.com"
rep=$(curl -v -X POST -d "UID=username&PWD=pass" $httpUrl)
status=$?
if [ "$?" -eq 0 ]; then
echo "Success"
exit $status
else
echo "Failed"
exit $status
fi
スクリプトを実行すると、戻りコードは常に$?=0
スクリプトが正常に実行されたが、cURL
の戻りコードを次の関数に適用したいため。
私はこのサイトでいくつかの方法を参照して試してみましたが、POST
コマンドとスクリプトを実行したときに出力が印刷されないようにする方法が原因で、あまり役に立ちません。
ありがとう
コマンド出力をrep
変数に割り当てても、curlコマンドの終了ステータスは失われません。 $?
として引き続きご利用いただけます。詳細については、 コマンドの戻り値や出力を変数に保存するにはどうすればよいですか? を参照してください。
通常、リクエストされたHTTPリソースが利用できない場合、ウェブサーバーは関連するHTTPステータスコードに対応するHTMLドキュメントで応答します。 404.このような場合、curlはサーバーからこのドキュメントを受け入れ、Webサーバーからの応答の取得に成功したため、エラードキュメントを表示し、ステータス0で成功して終了します。
HTTPリソースの取得で問題が発生した場合、curl
がエラーコードを返すことを期待していると思います。スクリプトでは、HTTPリソースの取得で問題が発生した場合は、curl
を失敗ステータスで終了することをお勧めします。そのためには、curlの-f, --fail
オプションをcurlに提供する必要があります。
サーバーエラーが発生しても、何も表示せずに(まったく出力しない)失敗します。これは主に、スクリプトなどが失敗した試行により適切に対処できるようにするために行われます。通常の場合、HTTPサーバーがドキュメントの配信に失敗すると、そのことを示すHTMLドキュメントが返されます(その理由も説明されています)。このフラグは、curlがそれを出力しないようにし、エラー22を返します。
この方法はフェイルセーフではなく、特に認証が含まれている場合(応答コード401および407)、失敗した応答コードがすり抜ける場合があります。
追加の変数status
を使用して、curlコマンドの終了ステータスを保存できます。
httpUrl="http://www.nnin.com"
rep=$(curl -f -v -d "UID=username&PWD=pass" "$httpUrl")
status="$?"
echo "$rep"
exit "$status"
シェル変数httpUrl
は、URLにシェルが解釈できる文字が含まれている場合に備えて、二重引用符で囲む必要があります。また、データが-X POST
オプションで提供される場合、POSTメソッドが常に使用されるため、-d
は必要ありません。
標準出力に出力するだけであれば、curlコマンドの出力をrep
変数に保存する必要はありません。
2番目の質問、「出力が印刷されないようにする方法」については、-v/--verbose
オプションを-s/--silent
に置き換えることができます。オプション(サイレントモード。進行状況メーターやエラーメッセージを表示しない)。
実際、最後のコマンドがcurlの呼び出しであれば、スクリプトをさらに簡略化できます。スクリプトの終了コードは、スクリプトの最後のコマンドの戻りコードになります。
httpUrl="http://www.nnin.com"
curl -f -s -d "UID=username&PWD=pass" "$httpUrl"