簡體   English   中英

如何根據curl的HTTP狀態代碼分支shell腳本?

[英]How can I branch a shell script based on an HTTP status code from curl?

我正在為備份編寫一個bash腳本。 腳本將運行curl,這將返回某個代碼。

取決於此代碼的結果:

  • 腳本必須繼續運行(如果返回代碼正常,如200)或
  • 腳本必須返回一個不正常狀態(如果返回代碼不正常,如400)並結束腳本而不做任何事情

如何從卷曲中讀出回報? 大多數人的簡單腳本,但...... ;-)

問題

curl程序是shell友好的,這意味着它的退出狀態反映了curl的狀態,而不是HTTP狀態代碼。

解決方案

您可以再次調用URL以獲取狀態代碼,使用write-out標志將狀態代碼附加到輸出,或者解析標頭。 這里有些例子。

第一個選項是天真的,因為您正在進行兩次單獨的調用,因此調用之間的狀態代碼可能不同。 然而,它在某些情況下可能有用。

# 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狀態代碼。 shell退出狀態必須介於0-255之間,並且許多HTTP狀態代碼都在該范圍之外。

也可以看看

curl -i stackoverflow.com 2>/dev/null | head -n 1 | cut -d\  -f2

我寫了一個demo,它可以打印狀態代碼。 :)

#!/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}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM