2014-10-28 96 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