Bashは構文エラーではなく、私が望むことを実行します

Bashは構文エラーではなく、私が望むことを実行します

スクリプトにロジックを実装しようとしていますが、期待通りにトリガーされないため、何かを見逃していると思います。

私のアイデアはシンプルです。パイプを使用して同じターミナルで実行されている別のバイナリからのテキストストリームに応答するスクリプトが欲しいのです。出力は次のようになります。

Received 835186
Received 835186
over and over

私はこれらすべてではなく、そのうちの 1 つだけを選択するロジックを作成しようとしていました。

これが私のコードです

#!/bin/bash
TOGGLE="/toggle"
RUN=0
NUM2=1

lights (){
    if [ ! -e $TOGGLE ]; then
#below if line i suspect is not triggering but can't see why
        if [ $RUN  == "0" ]; then
            touch $TOGGLE
            #/l-off.py
            echo "off"
            ((RUN=RUN+1))
        else
            rm $TOGGLE
            #/l-on.py
            echo "on"
            ((RUN=RUN+1))
        fi
    fi
#    togggle_func
    }
timclear (){
    while [ $RUN  == "1" ];do
        sleep 2s
        RUN=0
    done &
}
    
togggle_func () {    
    if [ "$RUN" -ge "$NUM2" ]; then
        #RUN=0
        timclear
        #return
#    else
#        lights
    fi
    }
#lines below that i want to control how many times its triggered 

while read line; do
  if [[ "$line" == "Received 835186" ]] || [[ "$line" == "Received 818562" ]]; then
    #togggle_func
    lights
    dt=$(date '+%r %d/%m/%Y')
    echo "Light Switch Pressed at $dt"
    echo "run $RUN"
    echo "num $NUM2"
  fi
done 

私の質問はまだ関連していますが、現時点ではCLIからこのように実行するときに、このスクリプトでパイプ自体を実行するにはどうすればよいかということです。/RFSniffer | /Rf_Test2.sh

前もって感謝します

答え1

いかがでしょうか:

#!/bin/bash
TOGGLE="/toggle"
RUN=0
NUM2=1
RFSNIFFERCMD="/RFSNIFFER"

lights (){
    if [ ! -e $TOGGLE ]; then
#below if line i suspect is not triggering but can't see why
        if [ $RUN  == "0" ]; then
            touch $TOGGLE
            #/l-off.py
            echo "off"
            ((RUN=RUN+1))
        else
            rm $TOGGLE
            #/l-on.py
            echo "on"
            ((RUN=RUN+1))
        fi
    fi
#    togggle_func
    }
timclear (){
    while [ $RUN  == "1" ];do
        sleep 2s
        RUN=0
    done &
}
    
togggle_func () {    
    if [ "$RUN" -ge "$NUM2" ]; then
        #RUN=0
        timclear
        #return
#    else
#        lights
    fi
    }
#lines below that i want to control how many times its triggered 

$RFSNIFFERCMD | while read line 
do
  if [[ "$line" == "Received 835186" ]] || [[ "$line" == "Received 818562" ]]; then
    #togggle_func
    lights
    dt=$(date '+%r %d/%m/%Y')
    echo "Light Switch Pressed at $dt"
    echo "run $RUN"
    echo "num $NUM2"
  fi
done

重要な点は、情報が入力されているテキストの最後から 11 行目の while ループへの変更です。

このスクリプトをさらに批判すると、/toggle ファイルの作成と削除に依存しているように見えます。これは状態を追跡する方法としては最悪で、変数を使用した方が効率的かもしれません。少なくとも、TOGGLE ファイルにファイル拡張子があり、RAMDISK (Ubuntu では /dev/shm など) に書き込み/読み取りが行われることを確認してください。

答え2

これはコメントとして投稿するには難しすぎるのですが、試してみました。以下の私のはるかに単純なスクリプトが、あなたがやろうとしていることに適合するでしょうか (そしてデバッグが簡単でしょうか)。複雑なループではなく、デバウンスを処理するために秒単位で時間を追跡するだけです。

#! /bin/bash

RFSNIFFERCMD="/RFSNIFFER"
DEBOUNCE=5


OLDTIME=$((`date +%s`-$DEBOUNCE))
TOGGLEFILE=/dev/shm/toggle.file

$RFSNIFFERCMD | while read line
do
    if [ "$line." == "Received 835186." ] || [ "$line."  == "Received 818562." ]
    then
        NOW=`date +%s`

        if [ $(($NOW - $OLDTIME)) -lt $DEBOUNCE ]
        then
            echo "Ignoring change at $NOW / $OLDTIME"
        elif [ -e $TOGGLEFILE ]
        then
            OLDTIME=$NOW
            rm $TOGGLEFILE
            echo "Turn On"
        else
            OLDTIME=$NOW
            touch $TOGGLEFILE
            echo "Turn Off"
        fi
    fi
done

関連情報