我是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之间。
我希望有人可以帮助我, 谢谢!
此致
克劳斯
答案 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
你已经保存了我的星期天=)
最诚挚的问候,
克劳斯