使用逗号的数字的IF条件的Bash脚本

时间:2016-01-17 13:12:04

标签: bash shell sh

我是bash脚本的新手,我真的需要你的帮助。

以下脚本从我的BananaPi上的DHT22传感器获取湿度和温度并将其发送到我的HomeAutomation。

#!/bin/bash
cd /opt/lol_dht22
WERTE=$(./loldht 7 | grep "Humidity")
Temp=( $(echo $WERTE | awk '{ print $ 7}'))
Hum=( $(echo $WERTE | awk '{ print $ 3}'))
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 temperature $Temp"
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 humidity $Hum"

结果类似于30.00(使用逗号),有时传感器会失败并给出不真实的值,如-3000.00或类似值。

所以我想实现一个IF条件,检查它是大于等于0还是等于100.

我尝试过这样的事情:

#!/bin/bash
cd /opt/lol_dht22
WERTE=$(./loldht 7 | grep "Humidity")
Temp=( $(echo $WERTE | awk '{ print $ 7}' | tr '.' ','))
Hum=( $(echo $WERTE | awk '{ print $ 3}' | tr '.' ','))
if [[ $Temp -ge 0 && $Temp -le 100 && $Hum -ge 0 && $Hum -le 100 ]]; then
Temp1=( $(echo $Temp | tr ',' '.'))
Hum1=( $(echo $Hum | tr ',' '.'))
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 temperature $Temp1"
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 humidity $Hum1"
else
exit;
fi 

似乎逗号(。)是问题所在,所以我尝试将其切换为(,)并返回。但有时仍有一些值不在0到100之间。

我希望有人可以帮助我, 谢谢!

此致

克劳斯

4 个答案:

答案 0 :(得分:1)

awk使用双打,可以很容易地用来测试十进制数的范围。

...
Temp=$(echo $WERTE | tr , . | awk '$7>=0&&$7<=100{print$7}')
Hum=$(echo $WERTE | tr , . | awk '$3>=0&&$3<=100{print$3}')
if [ -n "$Temp" -a -n "$Hum" ]; then
    ...
fi

答案 1 :(得分:0)

-lt-ge等仅适用于整数。您可以在<内使用>=[[等,它也应该适用于浮点数。

bash中的一些好习惯:

#!/bin/bash
set -e #autoexit if you run into an error
cd /opt/lol_dht22

#Reserve all-caps variables for exported variables and bash config variables
werte="$(./loldht 7 | grep "Humidity")" #always double-quote $ expressions
#foo=( bar ) creates arrays, you don't want that
#printf "%s\n" is more robust than echo if you're printing the contents of variables
Temp="$(printf '%s\n' "$werte" | awk '{ print $7 }' | tr . ,)"
Hum="$(printf '%s\n' "$werte" | awk '{ print $3 }' | tr . ,)"

#-lt etc. only work with integers
if [[ "$Temp" >= 0 && "$Temp" < 100 && "$Hum" >= 0 && "$Hum" < 100 ]]; then
  Temp1="$(printf '%s\n' "$Temp" | tr , .)"
  Hum1="$(printf '%s\n' "$Hum" | tr , .)"
  perl /opt/fhem/fhem.pl 7072 "setreading DHT22 temperature $Temp1"
  perl /opt/fhem/fhem.pl 7072 "setreading DHT22 humidity $Hum1"
else
  exit 1 #return nonzero codes for errors
fi

答案 2 :(得分:0)

请提及WERTE的内容。这将有助于回答问题,因为默认情况下awk FS是空格。我们需要正确理解您的7美元和3美元的内容

答案 3 :(得分:0)

谢谢你的家伙,

我学到了很多东西。

似乎有效:

#!/bin/bash
set -e
cd /opt/lol_dht22
WERTE=$(./loldht 7 | grep "Humidity")
Temp=$(echo $WERTE | awk '$7>=0&&$7<=100{print$7}')
Hum=$(echo $WERTE |  awk '$3>=0&&$3<=100{print$3}')
if [ -n "$Temp" -a -n "$Hum" ]; then
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 temperature $Temp"
perl /opt/fhem/fhem.pl 7072 "setreading DHT22 humidity $Hum"
else
exit 1
fi

你已经保存了我的星期天=)

最诚挚的问候,

克劳斯