1

ファイル「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行目 = while [ ! –f OK.temp ]

line 43: [: f: unary operator expected

52 行目 = [ $rResult -eq $rSaved ] の場合

line 52: [: too many arguments

どんな助けでも大歓迎です:)

4

4 に答える 4

1

これは 43 行目のダッシュではありません。ダッシュ全体です(コピーして、そのページで検索して確認してください)。そのコードをブログからコピーしましたか? 彼らはしばしば、そうすべきでない場所でそのような交換を行います。コードは次のようになります。

while [ ! -f ok.temp ]

-eq文字列ではなく数値用です-これでうまくいくはずです(引用符は重要です):

if [ "$rResult" = "$rSaved" ]
于 2012-05-24T11:14:19.620 に答える
0

ほとんどの場合、単一の角括弧内で空の引用符なしの変数を使用しているためです。これは、優先される二重角括弧形式を使用するか、変数を引用することで修正できます (両方を行う必要はありません)。

質問にタグを付けました、しかし、あなたのシバンは言い#!/bin/sh、スクリプトの形式は、Bash固有の機能を使用する代わりに、Bourneシェルの規則に従います。ご希望であれば、これらの Bash 機能をどのように利用できるかについてコメントできます。

于 2012-05-24T11:06:22.117 に答える
0

スクリプトで一部の変数が設定されていないか、空になっている可能性があります。set -xデバッグモードをオンにするように設定できます。

于 2012-05-24T11:10:25.440 に答える
0

変数の 1 つが空であるか、複数の単語が含まれています。引用符を使用:

if [ "$rResult" = "$rSaved" ]
于 2012-05-24T11:16:43.527 に答える