如何比较shell脚本中的十进制数?

时间:2014-11-05 05:50:44

标签: bash shell awk bc

#!/bin/bash
for input in $(cat status_cpu.txt)
do
      cpu=`ssh -i  root@$input 'top -b -n1' | grep "load" | awk '{print $12}'`

      max=2.02

if [ $(echo "$cpu < $max" | bc -l ) ]; then
    echo "yes"
else
    echo "no" 
fi
done  

cat status_cpu.txt
10.0.0.1
10.0.0.2

我想比较shell脚本中的小数点。

3 个答案:

答案 0 :(得分:1)

您可以使用bc -l进行比较,如下所示:

max='2.02'
s='2.01'

bc -l <<< "$max > $s"
1

s='2.05'
bc -l <<< "$max > $s"
0

所以bc -l表达式将打印1表示成功,0表示失败。

答案 1 :(得分:1)

您不需要在同一行使用awkgrepawk可以完成所有操作。
不要使用旧的和过时的背景,请使用括号。

所以这会改变:

cpu=`ssh -i  root@$input 'top -b -n1' | grep "load" | awk '{print $12}'`

要:

cpu=$(ssh -i  root@$input 'top -b -n1' | awk '/load/ {print $12}')

而且:

if [ $(echo "$cpu < $max" | bc -l ) ]; then
    echo "yes"
else
    echo "no" 
fi

可以写

[ $(echo "$cpu < $max" | bc -l ) ] && echo "yes" || echo "no"

[[ $(echo "$cpu < $max" | bc -l ) ]] && echo "yes" || echo "no"

答案 2 :(得分:0)

以下是如何将它放入Posix shell函数中,以后可以很容易地在shell测试中使用(可能是bc保留错误代码的返回码):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span dir="rtl">Coffee</span>
<span dir="ltr">Milk</span>
<span dir="rtl">Soda</span>

此函数的一个示例用法:

ifbc () { test $(echo "$@" | bc -l ) -ne 0; }