我需要在for循环内多次执行curl命令,并获取执行单个curl所需的平均时间。这就是我所拥有的:
while read query; do
TIMEFORMAT=%R; time for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='${query}' ${nginx_url} > /dev/null; done
done < queries.txt
这会在 stdout 中打印秒数,但我需要将该数字分配给一个变量以将其除以 3 以获得平均值。
我已经测试过:
realtime=$(time -f "%E" for i in {1..3} ..etc..)
realtime=`time -f "%E" for i in {1..3} ..etc..`
但这给出了语法错误./test-suite.sh: line 23: syntax error near unexpected token
do'。
我还测试过:
realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} ..etc..")
realtime=$(bash -c "time -f "%E" for i in {1..3} ..etc..")
realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} do ..etc.. ; done; echo $realtime")
所有这些都没有结果。欢迎任何想法。
答案1
我的建议是(稍微修改一下,因为我没有你的curl/HTTP设置):
$ t=$(TIMEFORMAT=%R bash -c 'time for i in {1..3}; do sleep $((RANDOM % 5)); done' 2>&1)
$ avg=$(bc <<< "scale=3; $t/3")
$ echo $avg # YMMV
2.667
由于time
它是 bash 内置的,因此我们需要将stderr
重定向放置在时间调用的“外部”;这就是为什么我用 包裹主要部分bash -c ...
。
您不需要每次循环都设置 TIMEFORMAT;只需将其放入调用 bash/time 的环境中即可。
请注意,shell 算术是基于整数的,因此对于浮点值,请使用类似bc
.我的time
输出有 3 个小数位,所以这bc
也是我所要求的。
答案2
我明白了,我也必须将命令括在括号中,
mytime=$(time (for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='select distinct ?Concept where {[] a ?Concept} LIMIT 100' http://143.233.226.61:443/sparql > /dev/null; done) 2>&1 1>/dev/null)