BASH 脚本 - 将数值存储在变量中,然后进行比较

BASH script - Storing numerical value in variable, then doing comparison

在 BASH 中有很多关于变量比较的重复 questions/examples,但 none 似乎对我有用。

代码逻辑: 通过执行命令导出 ping_val 的(平均)值:

ping_val=`ping -c 4 8.8.8.8| tail -1| awk '{print }' | cut -d '/' -f 2`

然后,如果该值小于20,则将另一个变量减20:

if [ $ping_val -lt 20 ] #line 30
then
  $tot_health = $tot_health - 20
fi

这是我的输出: ./my-report.sh: 第 30 行: [: 65.464: 整数表达式预期

注意:ping_val 的值已经过验证,因为我通过稍后图表中的原始数字进行了验证。

您的原脚本中有很多错误。基本上你的语法是你的问题。

这里有一个可用的版本。

ping_val=$( ping -c 4 8.8.8.8 | tail -1 | awk '{print }' | cut -d '/' -f 2 )

if [[ awk -v PING_VAL="$ping_val" 'BEGIN{ if(PING_VAL <20) { exit(0)} else{ exit(1)}}' ]] 
then
  tot_health=$(( tot_health - 20 ))
fi

希望对您有所帮助!

ping 的最后一行如下所示:

rtt min/avg/max/mdev = 36.731/72.502/90.776/21.038 ms

你正在解析这个例子中的 72.502。这不是一个整数。 Bash 仅适用于整数。如果你想比较浮点数,你需要一个像bc这样的外部工具。您还可以使用您喜欢的命令行语言(awkpythonperl 等)。由于您无论如何都想与整数进行比较(特别是小于比较),您可以截断小数点并进行比较。

像这样的东西会让你的比较工作:

if [ ${ping_val/.*} -lt 20 ] #line 30
then
  tot_health=$((tot_health - 20))
fi

所有 ${ping_val} 都在做,取 72.502 并将其变为 72。这永远不会改变程序的逻辑,因为您正在进行小于比较。