如何解析bash脚本中的命令结果

时间:2015-02-10 13:24:58

标签: bash

我想运行一个命令,然后检查字符串“200 OK”的结果。

到目前为止,我有以下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\"}"}

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

  1. 为什么bash脚本会打印有关总时间,速度等的统计信息来获取curl的结果?
  2. 我应该如何修改脚本,这样除非脚本失败,否则我只想查看计数器值(i)和表示通过的状态。如果失败,我希望脚本退出curl命令返回的内容的详细信息。
  3. 为什么我收到错误
  4.   

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

    任何提示?谢谢!

3 个答案:

答案 0 :(得分:1)

如果您不希望curl使用-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

答案 1 :(得分:1)

您可以使用此命令获取http_code

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

此命令在stdout中打印http代码

答案 2 :(得分:0)

RESULTS=$(cmd)将命令的输出分配给RESULTS,而不是命令返回的值。如果要检查输出中是否出现特定字符串,则通常使用grep(将消耗命令的输出,因此它将不可用):

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

如果您想检查结果,请执行以下操作:

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

请注意,在后一种情况下,cmd的输出仍将写入脚本的标准输出,因此您可能需要重定向。