我想运行一个命令,然后检查字符串“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\"}"}
基于以上结果,我有几个问题:
gettest.sh:8:[:1:HTTP / 1.1:意外的运营商?
任何提示?谢谢!
答案 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的输出仍将写入脚本的标准输出,因此您可能需要重定向。