/usr/bin/time を使用して for ループの結果を変数に割り当てます。

/usr/bin/time を使用して for ループの結果を変数に割り当てます。

forループ内でカールコマンドを複数回実行し、単一のカールを実行するのに必要な平均時間を取得する必要があります。これが私が持っているものです:

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

すべて役に立たない。どんなアイデアでも大歓迎です。

ベストアンサー1

私の提案は次のとおりです(カール/ 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

timebashが組み込まれているので、stderrリダイレクトを時間呼び出し「外部」に配置する必要があります。これがまさに主要部分をbash -c ...

ループを介して毎回TIMEFORMATを設定する必要はありません。 bash/time が呼び出される環境に入れるだけです。

シェル演算は整数ベースなので、浮動小数点値の場合bctimebc

おすすめ記事