2013-03-01 88 views
0

如果CPU負載超過某個限制,但是,它只是沒有正確工作,下面是代碼,我試圖減慢我的無限循環。 if條件總是結果爲真Bash/Shell腳本 - 算術運算符失敗

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 
+0

想過使用'nice'和委託加載處理到你的調度器? – 2013-03-01 16:12:59

+0

'>'是重定向操作符。你想要'-gt'。 – 2013-03-01 16:16:48

+2

@ n.m。除非這是ksh93,否則浮點運算不起作用。 – Scrutinizer 2013-03-01 16:24:55

回答

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 
+0

尊敬的用戶000001,執行您的建議後,現在我得到這個錯誤:「預期的整數表達式」 – 2013-03-01 16:20:33

+0

我忘了回聲 – user000001 2013-03-01 16:23:19

+0

此修復後:「[$(echo」$ x> 0.91「| bc -l)-eq 1]「我現在得到這個錯誤:./loop1.sh:找不到第21行:bc:命令 ./loop1.sh:第21行:0.51> 0.91:找不到命令 ./loop1.sh:line 21:[:-eq:一元運算符預期 – 2013-03-01 16:26:00

2

您需要使用bc浮點比較和使用((...))算術表達式:

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

也別用cat,使用:

IN=$(</proc/loadavg) 
+1

dogbane,嘗試你的提示,現在我得到這個錯誤:第21行:((:== 1:語法錯誤:操作數預期(錯誤標記是「== 1」) – 2013-03-01 16:30:23

0

Bash不能使用浮點運算。你可以這樣做:

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

非常感謝你的幫助,代碼正在工作! – 2013-03-01 16:59:46