Bash / Shell脚本 - 算术运算符失败

时间:2013-03-01 16:08:56

标签: bash shell math

如果CPU负载超过某个限制,我正试图减慢无限循环,但是,它只是没有正常工作,下面是代码。 if条件总是结果为真

c=1
while [ $c -le 1 ]
do
#echo "Welcome $c times"
#php BALHABLH.php

IN=$(cat /proc/loadavg);

set -- "$IN"
IFS=" "; declare -a Array=($*)
echo "${Array[@]}"
echo "${Array[0]}"
echo "${Array[1]}"

#var = ${Array[1]}



x=$(expr "${Array[1]}" )

if [ $x > 0.91 ]
then
    echo "CPU LOAD > 0.91"
    sleep 2
fi


(( c++ ))
done

3 个答案:

答案 0 :(得分:2)

您需要使用bc进行浮点比较,并使用(( ... ))作为算术表达式:

if (( $(bc -l <<< "$x > 0.91") == 1 ))

另请勿使用cat,请使用:

IN=$(</proc/loadavg)

答案 1 :(得分:0)

Bash只处理整数。要像这样处理浮动管道bc

[ $(echo " $x > 0.91" | bc -l) -eq 1 ]
如果比较结果为真,则

bc返回1。我们与1进行比较(使用-eq运算符)。

验证

$ cat test.sh
#!/bin/bash  
x="$1"
if [ $(echo " $x > 0.91" | bc -l) -eq 1 ]; then
   echo greater;
else 
   echo smaller;
fi
$ ./test.sh 0.5
smaller
$ ./test.sh 1.5
greater

您还可以像这样简化脚本:

#!/bin/bash
c=10
for (( i=1;i<=c;i++ )); do
    load=$(awk '{print $2}' /proc/loadavg)
    echo "$i: load is $load"
    if (( $(echo "$load > 0.91" | bc) == 1 )); then
        echo "CPU LOAD > 0.91"       
        sleep 2
    fi
done

答案 2 :(得分:0)

Bash不能使用浮点运算。你可以这样做:

if [ $( echo "$x > 0.91" | bc ) -eq 1 ]; then