2015-02-10 53 views
1

我想运行一个命令,然后检查字符串“200 OK”的结果。如何在bash脚本中解析命令的结果

到目前为止,我有以下bash脚本:

for i in $(seq 1 50) 
    do 
     printf "i is: $i\n" 
     RESULTS="$(curl -i -H "Accept: application/json" -X GET http://localhost/test/store/widget/123 | grep -ne "200 OK")" 
     if [ $RESULTS -eq 0 ]; then 
       echo "GET failed with $RESULTS" 
       break 
     else 
       echo "we're good" 
     fi 

done 

当我运行上面的脚本,我得到如下结果:

i is: 1 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 85 100 85 0  0 3944  0 --:--:-- --:--:-- --:--:-- 4047 
gettest.sh: 8: [: 1:HTTP/1.1: unexpected operator 
we're good 
i is: 2 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 85 100 85 0  0 3293  0 --:--:-- --:--:-- --:--:-- 3400 
gettest.sh: 8: [: 1:HTTP/1.1: unexpected operator 
we're good 

的输出,我回来从运行curl命令一次看起来像这样:

HTTP/1.1 200 OK 
Date: Tue, 10 Feb 2015 13:21:18 GMT 
Server: Apache/2.4.7 (Ubuntu) 
X-Powered-By: PHP/5.5.9-1ubuntu4.5 
Content-Length: 85 
Content-Type: application/json; charset=utf-8 

{"status":pass,"widgetinfo":"{\"widgetname\":\"the best widget\",\"price\":\"100.00\"}"} 

基于上述结果,我有几个问题s:

  1. 为什么bash脚本会打印有关总时间,速度等的统计数据以获得curl结果?
  2. 我该如何修改脚本,以便除非脚本失败,我只想看到计数器值(i)和指示通过的状态。如果失败,我希望脚本退出,并详细说明curl命令返回的内容。
  3. 为什么我收到错误

gettest.sh:8:1:HTTP/1.1:意外的运营商?

任何提示?谢谢!

回答

1

如果您不希望使用-s来打印统计数据,那么在错误4xx和5xx的情况下,您可以使用-f以非零值退出。

有效的请求:

curl -sf example.com -o /dev/null ; echo $? 
0 

找不到404:

curl -sf example.com/test ; echo $? 
22 

如果你想要错误消息-S

curl -sfS example.com/test ; echo $? 
curl: (22) The requested URL returned error: 404 Not Found 
22 

从手册:

man curl | grep '\-[Ssf],' -A 3 
     -f, --fail 
       (HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed 
       attempts. In normal cases when a HTTP server fails to deliver a document, it returns an HTML document stating so (which often also 
       describes why and more). This flag will prevent curl from outputting that and return error 22. 
-- 
     -s, --silent 
       Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute. 

     -S, --show-error 
       When used with -s it makes curl show an error message if it fails. 

所以,你的脚本可能是这样的:

RESULTS="$(curl -sSfi -H "Accept: application/json" -X GET http://localhost/test/store/widget/123 -o /dev/null 2>&1)" 
if [ $RESULTS -eq 0 ]; then 
     echo "GET failed with $RESULTS" 
     break 
else 
     echo "we're good" 
fi 
0

RESULTS=$(cmd)分配命令的输出结果,而不是由命令返回的值。如果你想检查一个特定的字符串出现在输出中,常见的是使用grep(这将消耗命令的输出,所以这将是不可用):

if cmd | grep -q "some string"; then ... 

如果你想检查结果,只是做:

if cmd; then echo cmd succeeded ... 
else echo cmd failed ... 
fi 

注意,在后一种情况下,CMD的输出仍将被写入脚本的标准输出,所以你可能要重定向。

1

你可以使用此命令

curl -s -o /dev/null -w "%{http_code}" http://www.wikipedia.org 

此命令打印在标准输出的HTTP代码

+0

好的技巧得到HTTP_CODE用'-w' +1 – Tiago 2015-02-10 23:10:52