2012-05-24 3 views
0

Практически он проверяет, существует ли файл ok.temp. Если это не так, он переходит в цикл сна в течение 2 секунд, прежде чем снова проверять. После того, как файл считается, что он существует, он продолжается.Пока файл существует в bash

К сожалению, я получаю ошибки, указанные ниже следующий код:

#!/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 

И я получаю эти ошибки:

Line 43 = в то время как [! -f ok.temp]

line 43: [: f: unary operator expected 

линия 52 = если [$ rResult -eq $ rSaved]

line 52: [: too many arguments 

Любая помощь будет принята с благодарностью :)

+0

Это линии 43 и 52? (tl; dr) –

+0

Только что отредактировано + добавлено :) – Linky

+0

Пожалуйста, замените, по крайней мере, строки, которые вызвали ошибки. В противном случае кто-то, кто хочет их увидеть, должен щелкнуть ссылку «отредактирован». Ваша проблема и ответы ниже могут помочь кому-то, кто приходит к этому вопросу через поиск. –

ответ

0

Скорее всего, это потому, что вы» re с использованием некотируемых переменных, которые пусты в квадратных скобках. Вы можете исправить это, используя предпочтительную форму с двойной квадратной скобкой или путем цитирования переменных (сделать это не нужно).

Вы отметили свой вопрос , но ваш shebang говорит #!/bin/sh, а форма вашего скрипта следует за условными обозначениями оболочки Bourne, а не с использованием специфичных для Bash функций. Если вы хотите, я могу прокомментировать, как вы можете использовать эти функции Bash.

+0

Исправлено сравнение строк в строке 52 с использованием кавычек и == вместо -eq. Ошибка строки 43 :( – Linky

+0

@Linky: Я не вижу никакой причины, по которой оператор 'while' должен дать вам эту ошибку. Какую оболочку вы используете? Что такое ОС? –

+0

ahhh мои извинения. Давайте останемся с shebang Теперь я отредактирую тег. – Linky

0

Вероятно, что некоторая переменная не установлена ​​или пуста в сценарии. Вы можете установить set -x, чтобы включить режим отладки.

1

Это не штрих в строке 43 - это en dash (скопируйте его и найдите на этой странице, чтобы увидеть его). Вы скопировали этот код из блога? Они часто делают такие замены там, где они не должны. Код должен гласить:

while [ ! -f ok.temp ] 

-eq для чисел, а не строки - Это должно сделать трюк (кавычки необходимы):

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

У вас есть превосходный видение и, как результат, выиграть один целый Интернет. +1 –

+0

Пожалуйста, объясните немного подробнее. Что я должен изменить? – Linky

+0

@ l0b0 Нет. Я не копировал код из блога, но я сделал из примера сценария скелета из нашего лектора из pdf. Я поражен, что ты на самом деле понял, у тебя безупречное зрение. Вы, сэр, король среди мужчин. Я благодарю тебя! – Linky

0

Один из ваших переменных пуст или содержит несколько слов , Использовать котировки:

if [ "$rResult" = "$rSaved" ] 
Смежные вопросы