它几乎检查文件'ok.temp'是否存在。如果没有,它会进入一个睡眠循环2秒钟,然后再次检查。在认为文件存在之后,它继续。
不幸的是,我收到以下代码中所述的错误:
#!/bin/sh
# Read the sensor values
if [ ! -f saved.txt ]
then
touch saved.txt
fi
#saved values count
sCount=0
#value aggregates
vTTemp=0
vTHumid=0
vTLux=0
#previous aggregates
pTTemp=0
pTHumid=0
pTLux=0
while :
do
vTemp=0
vHumid=0
vLux=0
if [ $sCount -gt 0 ]
then
if [ $(( $sCount % 5 )) -eq 0 ]
then
#set previous aggregates as current
pTTemp=$vTTemp
pTHumid=$vTHumid
pTLux=$vTLux
#reset current aggregates
vTTemp=0
vTHumid=0
vTLux=0
fi
fi
while [ ! –f ok.temp ]
do
sleep 20
done
if [ -f logfile.txt ]
then
rResult=`tail -1 logfile.txt`
rSaved=`tail -1 saved.txt`
if [ $rResult -eq $rSaved ]
then
vTemp=`echo $rResult | cut -d" " -f1`
vHumid=`echo $rResult | cut -d" " -f2`
vLux=`echo $rResult | cut -d" " -f3`
echo $rResult >> saved.txt
# aggregate results
vTTemp=`expr $vTTemp + $vTemp`
vTHumid=`expr $vTHumid + $vHumid`
vTLux=`expr $vTLux + $vLux`
echo 'Most recent results recieved from sensor has been saved'
else
echo 'Most recent result has already been saved, skipping'
fi
fi
echo '[Previous] Temp:'$pTTemp' Humid:'$pTHumid' Lux:'$pTLux
echo '[Current] Temp:'$vTTemp' Humid:'$vTHumid' Lux:'$vTLux
sCount=`expr $sCount + 1`
done
我收到了这些错误:
第43行=而[! -f ok.temp]
line 43: [: f: unary operator expected
第52行=如果[$ rResult -eq $ rSaved]
line 52: [: too many arguments
非常感谢任何帮助:)
答案 0 :(得分:1)
这不是第43行的破折号 - 它是en dash(复制它并在该页面上搜索以查看它)。您是否从博客中复制了该代码?他们经常在不应该做的情况下进行替换。代码应为:
while [ ! -f ok.temp ]
-eq
用于数字,而不是字符串 - 这应该可以解决问题(引号很重要):
if [ "$rResult" = "$rSaved" ]
答案 1 :(得分:0)
很可能是因为你在单方括号内使用了空引用的变量。你可以通过使用首选的双方括号形式或引用变量来解决这个问题(不需要两者)。
您已标记了问题bash,但您的shebang说#!/bin/sh
并且您的脚本的形式遵循Bourne shell约定,而不是使用Bash特定的功能。如果您愿意,我可以评论您如何利用这些Bash功能。
答案 2 :(得分:0)
脚本中可能没有设置某个变量或为空。您可以设置set -x
以打开调试模式。
答案 3 :(得分:0)
您的一个变量是空的,或包含多个单词。使用引号:
if [ "$rResult" = "$rSaved" ]