将管道curl命令输出到bash中的变量
我试图监视代理服务器的输出以解决问题,为此我创建了一个使用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:
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!一直以来都是这样,我只是通过改变变量使事情变得更糟!