Bash
用變數中的 /usr/bin/time 分配測量 for 循環的結果
我需要在 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 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")
他們都沒有結果。歡迎任何想法。
我明白了,我也必須將命令括在括號中,
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
的。