将管道curl命令输出到bash中的变量

将管道curl命令输出到bash中的变量,bash,Bash,我试图监视代理服务器的输出以解决问题,为此我创建了一个使用curl的bash脚本,但是在获取变量中的输出时遇到了问题 我尝试了不同的方法来转义和使用变量,或者使用记号或括号 我第一次使用这个,但工作不正常: response=$(curl -k -x $i:1234 -U $u:$p -w $outputformat -s -o /dev/null $site | cut -d ' ' -f 2) 因此对其进行了更改,代码现在如下所示: response=$(curl\ -k\ -x\ $i:

我试图监视代理服务器的输出以解决问题,为此我创建了一个使用curl的bash脚本,但是在获取变量中的输出时遇到了问题

我尝试了不同的方法来转义和使用变量,或者使用记号或括号

我第一次使用这个,但工作不正常:

response=$(curl -k -x $i:1234 -U $u:$p -w $outputformat -s -o /dev/null $site | cut -d ' ' -f 2)
因此对其进行了更改,代码现在如下所示:

response=$(curl\ -k\ -x\ $i:1234\ -U\ $u:$p\ -w\ \"HTTP\ Response:\ \%\{http\_code\}\ \-\ URL:\ \%\{redirect\_url\}\\n\"\ -s\ -o\ /dev/null\ $site\ \|\ cut\ -d\ \'\ \'\ -f\ 2)
if [ "$response" -eq 200 ]; then
   ((count200++))
   echo $count200 > $counter_200
else
   ((countx0x++))
   echo $count0x0 > $counter_x0x
fi
8月22日-根据要求更新代码,我将代码恢复到以前的状态,并根据Waldde的建议删除了-o选项:

echo "Proxy: $i"
echo "Fetching site: $site"
outputformat="\"HTTP Response: %{http_code} - URL: %{redirect_url}\n\"" 
response=$(curl -k -x $i:$port -U $u:$p -w $outputformat -s $site | cut -d ' ' -f 2)
if [ "$response" -eq 200 ]; then
   ((count200++))
   echo $count200 > $counter_200
else
   ((countx0x++))
   echo $count0x0 > $counter_x0x
fi
这是我看到的错误消息:

./ptest.sh:第80行:curl-k-x******:***-U:-w HTTP响应:%%{HTTP_code}-URL:%%{redirect_URL}\n-s-o/dev/null | cut-d''-f2:没有这样的文件或目录

./ptest.sh:第82行:[::应为整数表达式

8/22更新-这是我现在遇到的问题:

代理:************ 获取站点: html> id=原子 ... 为可读性而缩短-html输出 ... 响应::需要整数表达式 ./ptest.sh:第83行:[:响应::应为整数表达式


有人能解释一下我做错了什么吗?

您需要删除将输出写入文件的-o选项,在您的例子中是/dev/null。下面是您应该可以使用的更新代码

$ response=$(curl -k -x $i:1234 -U $u:$p -w $outputformat -s $site | cut -d ' ' -f 2)
另一种检查方法是删除管道并将STDERR发送到/dev/null。这将显示传递给cut命令的内容

如果大家都高兴,你应该去看看

$ curl -k -x $i:1234 -U $u:$p  -s $site 2>/dev/null
如果没有得到任何输出,则删除STDERR重定向并回显返回代码

$ curl -k -x $i:1234 -U $u:$p  -s $site
$ echo $?
0
如果退出代码不是0,那么您就有一个错误。您可以在手册页中找到错误代码,或者这篇文章写得很好

否以获取响应代码

$ curl  -w "HTTP Response: %{http_code} - URL: %{redirect_url}\n"  -o /dev/null  -s http://yahoo.com/
HTTP Response: 301 - URL: https://yahoo.com/
$  curl  -w "%{http_code}\n"  -o /dev/null  -s http://yahoo.com/
301
$ response=$(curl  -w "%{http_code}\n"  -o /dev/null  -s http://yahoo.com/)
$ echo $response
301
$  curl  -w "%{http_code}\n"  -o /dev/null  -s http://yahoo.com/ | cut -d' ' -f3
301
$ response=$( curl  -w "%{http_code}\n"  -o /dev/null  -s http://yahoo.com/ | cut -d' ' -f3)
$ echo $response
301

为什么要添加所有这些反斜杠?您所做的更改完全是为了让情况变得更糟—它所查找的不是像/usr/bin/curl这样的文件,而是像/usr/bin/curl-k-x这样的文件……程序名中包含空格和参数……请向我们提供您从原始代码中得到的更接近工作代码的错误消息,而不仅仅是说没有进一步的细节说明它工作不正常,只给我们一个详细的错误,代码比原来的更坏。引用所有变量扩展。Bash经验法则001:将所有美元符号括在双引号内。总是。没有例外。不受监管的美元会引发崩溃。Bash经验法则002:背面ick不存在。它是一个外星符号,你必须从你的大脑和键盘上删除。U+60是一个未分配的代码点。命令替换只有一种语法,这种语法是$..。严格应用这些规则,你会自动成为一个更好的Bash程序员。安全第一!记住!@CharlesDuffy我添加它是为了防止我现在遇到的问题是,curl没有得到输出格式,我得到的是html输出,而不是我想要的输出。我已经添加了代码和我得到的原始输出。这就是发生的事情,它不尊重输出格式,输出html:Iteration:1 Proxy:************获取站点:html>id=atomic…shortened为可读性…响应::需要整数表达式。/ptest.sh:第83行:[:Response::integer expression expected现在我得到了您想要的结果。我更新了答案,显示我提取了响应代码。请注意,响应代码是字段3,而不是使用您的输出格式剪切的字段2。嗨,Waldde,当我从命令行执行时,它正在工作,但从bash脚本中我没有得到html代码。感谢您指出剪切时的e拼写错误。是否在$outputresponse变量周围添加引号,使其看起来像$outputresponse?好的,我现在觉得自己很笨!谢谢Waldde!一直以来都是这样,我只是通过改变变量使事情变得更糟!