Bash

用變數中的 /usr/bin/time 分配測量 for 循環的結果

  • August 7, 2017

我需要在 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

這會在標準輸出中列印秒數,但我需要將該數字分配給一個變數以將其除以 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 tokendo’。

我還測試過:

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")

他們都沒有結果。歡迎任何想法。

我明白了,我也必須將命令括在括號中,

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)

我的建議是(稍作修改,因為我沒有你的 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的。

引用自:https://unix.stackexchange.com/questions/384482