为循环shell脚本取平均工作完成的次数

这是我的第一个shell脚本

#!/bin/bash COUNTER=0 while [ $COUNTER -lt 10000 ]; do date; time wget -q 'http://exmple.com/' > /dev/null | grep real; sleep 3; let COUNTER=COUNTER+1 done echo ${COUNTER} Request Sent\n Average Response Time is : 

此脚本下载页面内容并计算页面响应时间

我需要存储实参,并计算它的平均值

脚本的输出是这样的

 Tue Oct 25 22:43:36 real 0m13.275s user 0m0.004s sys 0m0.008s 

所以我的问题是:

  • 如何在按下crtl + c(停止脚本)之后添加一些作业(如echo $ {COUNTER})

  • 我怎样才能在几秒钟内存储“真实”的价值/ /有时页面响应去分钟,所以基本上需要一些时间转换function(?)

我试图解决这个问题,但正如我所提到的,我正在训练shell脚本

 #!/bin/bash echo "How many runs would you like to perform?" read limit total_time=0 counter=1 while [ ${counter} -le ${limit} ] do date run_time=`(time -p wget -qO- http://exmple.com/) 2>&1 > /dev/null | grep real | awk '{print $2}'` echo "Run ${counter} completed in ${run_time} seconds" total_time=$(bc<<<"${total_time}+${run_time}") if [ ${counter} -ne ${limit} ] then sleep 3 let counter=counter+1 fi done avg=$(printf "%.3f" "$(bc -l <<<"${total_time}/${limit}")") echo "${counter} requests were sent taking ${total_time} seconds" echo "Average response time was : ${avg} seconds" 

以上是一个修改后的脚本,用于执行您所请求的操作,并进行一些修改

  • 添加一个问题,然后输入问每次有多少运行,而不是一个静态的数字
  • 打印出运行的总时间,然后以小数点后三位的平均值运行
  • 如果是最后一次跑步,跳过睡觉

你会注意到我们使用bc而不是let几条数学线。 bc命令允许使用小数位。

https://www.gnu.org/software/bc/manual/html_mono/bc.html

为了在几秒钟内得到这个值,我不得不使用awk来将行中的标题'real'的值分开。 然后,你可以做数字的数值。

还有一件事我在你的初始脚本中注意到了。 你用两种方式显示一个变量:

$COUNTER${COUNTER}

虽然两者都是合法的,但是我养成了总是封装变量的习惯,当你想添加变量的时候,它会让事情变得更容易。

例如,假设我有一个定义的数字( NUM=7 ),但要显示它的时间10.如果我不封装echo $NUM0那么我得到一个错误,因为变量$NUM0没有定义。 但是,如果我封装echo ${NUM}0将显示70的输出。

所有这些导致如下的最终输出

 How many runs would you like to perform? 5 Tue Oct 25 16:02:58 MST 2016 Run 1 completed in 0.09 seconds Tue Oct 25 16:03:01 MST 2016 Run 2 completed in 0.08 seconds Tue Oct 25 16:03:05 MST 2016 Run 3 completed in 0.07 seconds Tue Oct 25 16:03:08 MST 2016 Run 4 completed in 0.09 seconds Tue Oct 25 16:03:11 MST 2016 Run 5 completed in 0.08 seconds 5 requests sent taking .41 seconds Average response time was : 0.08 seconds 

如果您对剧本有其他疑问,请告诉我。

你可以记录一个相当精确的时间,例如

 t1=$(date +%s.%N) wget ... t2=$(date +%s.%N) diff=$(($t2-$t1)) 

为了在Ctrl + C(这实际上是一个SIGINT信号)之后做些东西,请阅读内置的trap