如何比较shell脚本中的两个ping? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我试图找出哪个搜索引擎将为我提供最快的ping,然后在单个输出中得到结果,但我无法弄清楚如何在shell脚本中放置if语句。我的代码如下

png=10000    
for item in ${array[*]}
            do
                png_cal=`ping -c 4 "$item" | tail -1| awk '{print $4}' | cut -d '/' -f 2`
                if [[ $png < $png_cal ]];then
                    png=${png_cal}
                    link=${item}
                fi
            done

并且我的程序在第一次循环后不再循环。

bash shell unix
1个回答
1
投票

您当前的问题是如何比较Bash中的浮点数,而您的代码只会比较整数。

我让它像这样工作:

array=(www.google.com www.facebook.com www.linkedin.com www.stackoverflow.com)
fastest_response=2147483647 # largest possible integer
for site in ${array[*]}
do
  this_response=`ping -c 4 "$site" | awk 'END { split($4,rt,"/") ; print rt[1] }'`
  if (( $(bc -l <<< "$this_response < $fastest_response") )) ; then
    fastest_response=$this_response
    fastest_site=$site
  fi
  echo "Got $this_response for $site ; fastest so far $fastest_site"
done
echo $fastest_site

进一步说明:

  • 请参阅this相关的Stack Overflow答案,了解为什么在Bash中比较浮点数的表达式如此复杂。
  • 我通过在awk中执行所有操作来简化对tail,awk等的调用,这更干净。
  • 注意我给变量更有意义的名字。当变量名称恰好宣告自己的真实情况时,可以更容易地思考代码。
  • 而不是10,000我选择在Bash中使用最大可能的整数。这只是一种风格的东西,因为它看起来不像10,000。
  • 我还让脚本与用户进行了一些沟通,因为用户不想在不知道发生了什么的情况下坐在那里等待ping。

最终获胜者是:

$ bash test.sh                                                                                                                                                
Got 21.786 for www.google.com ; fastest so far www.google.com
Got 20.879 for www.facebook.com ; fastest so far www.facebook.com
Got 20.555 for www.linkedin.com ; fastest so far www.linkedin.com
Got 21.368 for www.stackoverflow.com ; fastest so far www.linkedin.com
www.linkedin.com
© www.soinside.com 2019 - 2024. All rights reserved.