Bash macht was ich will, kein Syntaxfehler

Bash macht was ich will, kein Syntaxfehler

Ich versuche, ein wenig Logik in mein Skript zu implementieren, aber ich glaube, ich habe etwas übersehen, da es nicht wie vorgesehen ausgelöst wird.

Meine Idee ist einfach: Ich möchte, dass das Skript auf einen Textstrom von einer anderen Binärdatei reagiert, die im selben Terminal über eine Pipe ausgeführt wird. Die Ausgabe sieht so aus:

Received 835186
Received 835186
over and over

Ich habe versucht, eine Logik zu entwickeln, um nur eines davon und nicht alle mitzunehmen.

Hier ist mein Code

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

Meine Frage ist immer noch damit verbunden, wie ich dieses Skript dazu bringe, die Pipe selbst auszuführen, während ich es im Moment so von der CLI aus ausführe/RFSniffer | /Rf_Test2.sh

Dank im Voraus

Antwort1

Wie wäre es mit:

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

Der entscheidende Punkt ist die Änderung der While-Schleife 11 Zeilen vom Ende des Textes entfernt, in die die Informationen eingespeist werden.

Wenn ich das Skript weiter kritisieren darf: Sie scheinen sich darauf zu verlassen, dass eine Datei /toggle erstellt und gelöscht wird. Dies scheint eine schreckliche Methode zu sein, um den Status zu verfolgen, und könnte mit einer Variablen effizienter umgesetzt werden. Stellen Sie zumindest sicher, dass die TOGGLE-Datei eine Dateierweiterung hat und in RAMDISK geschrieben/von dort gelesen wird (z. B. /dev/shm unter Ubuntu).

Antwort2

Das ist zu schwer, um es als Kommentar zu posten, aber ich habe es versucht. Ich frage mich, ob mein viel einfacheres Skript unten zu dem passt, was Sie versuchen (und leichter zu debuggen ist). Anstatt komplexer Schleifen behalte ich einfach die Zeit in Sekunden im Auge, um das Entprellen zu handhaben.

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

verwandte Informationen