虽然文件存在于bash中

时间:2012-05-24 11:02:26

标签: file shell while-loop exists

它几乎检查文件'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.t​​emp]

line 43: [: f: unary operator expected

第52行=如果[$ rResult -eq $ rSaved]

line 52: [: too many arguments

非常感谢任何帮助:)

4 个答案:

答案 0 :(得分:1)

这不是第43行的破折号 - 它是en dash(复制它并在该页面上搜索以查看它)。您是否从博客中复制了该代码?他们经常在不应该做的情况下进行替换。代码应为:

while [ ! -f ok.temp ]

-eq用于数字,而不是字符串 - 这应该可以解决问题(引号很重要):

if [ "$rResult" = "$rSaved" ]

答案 1 :(得分:0)

很可能是因为你在单方括号内使用了空引用的变量。你可以通过使用首选的双方括号形式或引用变量来解决这个问题(不需要两者)。

您已标记了问题,但您的shebang说#!/bin/sh并且您的脚本的形式遵循Bourne shell约定,而不是使用Bash特定的功能。如果您愿意,我可以评论您如何利用这些Bash功能。

答案 2 :(得分:0)

脚本中可能没有设置某个变量或为空。您可以设置set -x以打开调试模式。

答案 3 :(得分:0)

您的一个变量是空的,或包含多个单词。使用引号:

if [ "$rResult" = "$rSaved" ]