如何在Shell脚本中的两个ping之间进行比较?

时间:2019-02-14 10:51:52

标签: bash shell unix

我正在尝试找出哪个搜索引擎将为我提供最快的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

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

1 个答案:

答案 0 :(得分: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中的float的表达式是如此复杂。

  • 我只是通过在awk中完成所有操作来简化了对tail,awk等的调用,这更加干净。

  • 注意,我为变量赋予了更有意义的名称。当变量名准确地宣布自己的真实含义时,考虑代码要容易得多。

  • 我选择使用Bash中可能的最大整数而不是10,000。这只是一种样式,因为它看起来不像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