2011-11-22 235 views
4

我有一個簡單的BASH shell腳本來檢查curl命令的HTTP響應代碼。 邏輯是好的,但我堅持「簡單」打印出「輸出」。BASH shell腳本echo在同一行輸出

我使用GNU的bash,版本3.2.25(1)-release下(x86_64-紅帽Linux的GNU的)

我想用一個標籤輸出的URL - 那麼404 | 200 | 501 | 502迴應。例如:

http://www.google.co.uk<tab>200 

我也得到一個奇怪的錯誤,其中一個URL的「HTTP」部分正在與覆蓋200 | 404 | 501 | 502。有沒有一個基本的BASH shell腳本(功能),我沒有使用?

謝謝

英里。

#!/bin/bash 

NAMES=`cat $1` 
for i in $NAMES 
do 

    URL=$i 
    statuscode=`curl -s -I -L $i |grep 'HTTP' | awk '{print $2}'` 

    case $statuscode in 
    200) 
     echo -ne $URL\t$statuscode;; 
    301) 
     echo -ne "\t $statuscode";; 
    302) 
     echo -ne "\t $statuscode";; 
    404) 
     echo -ne "\t $statuscode";; 
    esac 
done 

回答

1

嘗試

200) 
    echo -ne "$URL\t$statuscode" ;; 
2

this answer你可以用代入你的循環代碼

response=$(curl --write-out %{http_code} --silent --output /dev/null servername)


這將是

#!/bin/bash 

NAMES=`cat $1` 
for i in $NAMES 
do 

    URL=$i 
    statuscode=$(curl --write-out %{http_code} --silent --output /dev/null $i) 

    case $statuscode in 
     200) 
      echo -e "$URL\t$statuscode" ;; 
     301) 
      echo -e "$URL\t$statuscode" ;; 
     302) 
      echo -e "$URL\t$statuscode" ;; 
     404) 
      echo -e "$URL\t$statuscode" ;; 
     *) 
      ;; 
    esac 
done 

我已經清理了echo語句,因此每個URL都有一個新行。

0

我在這裏採取刺法,但我認爲有什麼讓您感到困惑的是curl有時會在初始請求重定向時返回多個頭信息(因此有多個狀態碼)。

例如:

[[email protected]]$ curl -sIL www.google.com | awk '/HTTP/{print $2}' 
302 
200 

當你打印的是在一個循環中,它會出現在第二個狀態碼已經成爲下一個URL的一部分。

如果這確實是你的問題,那麼有幾種方法可以解決這個問題,這取決於你試圖達到的目標。

  1. 如果你不想遵循重定向,簡單的離開了-L選項curl

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}') 
    
  2. 只參加最後的狀態代碼,只需管整個命令tail -n1取只有最後一個。

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tail -n1) 
    
  3. 要顯示訂單的所有代碼,用空格

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tr "\n" " ") 
    

例如,使用第三場景替換所有換行符:

[[email protected]]$ cat script.sh 
#!/bin/bash 
for URL in www.stackoverflow.com stackoverflow.com stackoverflow.com/xxx 
do 
    statuscode=$(curl -siL $i | awk '/^HTTP/{print $2}' | tr '\n' ' ') 
    echo -e "${URL}\t${statuscode}" 
done 

[[email protected]]$ ./script.sh 
www.stackoverflow.com 301 200 
stackoverflow.com  200 
stackoverflow.com/xxx 404