2014-10-28 42 views
1

我正在使用curl來檢查我是否可以在我的某個代理服務器上訪問特定文檔。 當檢查代理是否是負載均衡器的成員時,將根據此文件進行檢查。Curl:返回奇怪的輸出比預期,但爲什麼?

實施例:

[[email protected] scripts]# curl http://`hostname`:8080/proxy/keepalive?file=/workspace/temp/1.txt 
ppp 
[[email protected] scripts]# 

該輸出意。

如果我試圖比較這些輸出,測試是假的:

#!/bin/bash 
tmp=$(curl http://$(hostname):8080/proxy/keepalive?file=/workspace/temp/1.txt) 
echo $tmp 
if [ "$tmp" = "ppp" ]; then 
    echo "Match" 
else 
    echo "No match" 
fi 

我使用調試模式(bash -x)運行腳本:

[[email protected] scripts]# bash -x testscript 
+++ hostname 
++ curl 'http://XXXXX.com:8080/proxy/keepalive?file=/workspace/temp/1.txt' 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
    0  5 0  5 0  0 2326  0 --:--:-- --:--:-- --:--:-- 5000 
+ tmp=$'ppp\r' 
+ echo $'ppp\r' 
ppp 
+ [[ $'ppp\r' = ppp ]] 
+ echo 'No match' 
No match 
[[email protected] scripts]# 

我也試着寫的curl輸出到臨時文件/tmp/tmp,然後cat該文件但我得到相同的響應。您可以在調試輸出看到$tmp變量,其持有的curl輸出顯示的

tmp=$'ppp\r' 

代替

tmp='ppp' 

任何人都可以請流下了關於這個問題的一些輕和解釋這種現象? 在此先感謝,

+0

你加入'-o tmp'你的變量賦值'curl'命令。這告訴curl將輸出發送到文件而不是stdout。命令替換捕獲標準輸出內容。如果你需要/希望你想用'tee'。 – 2014-10-28 15:43:12

+0

這實際上只是另一個嘗試,當不使用'-o'開關時,我會得到完全相同的響應。 – 2014-10-28 15:44:49

+0

你確定服務器給你一致的結果嗎?因爲如果curl命令向stdout發送一個字符串,那麼命令替換就會捕獲它。 – 2014-10-28 15:46:42

回答

2

\r是一個回車符,它在那裏,因爲Web服務器返回DOS行終止符。

你可以用tr剝奪他們:

TMP=$(curl "http://$HOSTNAME:8080/proxy/keepalive?file=/workspace/temp/1.txt" | tr -d '\r') 
if [[ $TMP = ppp ]] 
then 
    echo "It's true" 
fi 
+0

感謝編輯隊友。 – 2014-10-28 16:23:24