这是我的第一个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
。