Bash hace lo que quiero, no error de sintaxis

Bash hace lo que quiero, no error de sintaxis

Estoy tratando de implementar un poco de lógica en mi script, pero creo que me he perdido algo porque no se activa como debería.

Mi idea es simple: quiero que el script responda a un flujo de texto de otro binario que se ejecuta en el mismo terminal usando una tubería. La salida se ve así

Received 835186
Received 835186
over and over

Estaba intentando crear una lógica para elegir solo uno de estos en lugar de todos.

Aquí está mi código.

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

Mi pregunta aún relacionada es ¿cómo hago para que este script ejecute la tubería en sí mientras lo ejecuto desde el cli de esta manera en este momento?/RFSniffer | /Rf_Test2.sh

Gracias de antemano

Respuesta1

Qué tal si:

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

La clave es el cambio al bucle while de 11 líneas desde la parte inferior del texto, que recibe la información.

Si puedo criticar más el script, parece que estás confiando en la creación y eliminación de un archivo/alternar. Esta parece ser una forma horrible de rastrear el estado y podría funcionar de manera más eficiente usando una variable. Como mínimo, asegúrese de que el archivo TOGGLE tenga una extensión de archivo y esté escrito/leído hacia y desde RAMDISK (por ejemplo, /dev/shm en Ubuntu)

Respuesta2

Es demasiado difícil publicarlo como comentario, pero lo he jugado. Me pregunto si mi script mucho más simple a continuación se ajustaría a lo que estás intentando hacer (y sería más fácil de depurar). En lugar de bucles complejos, simplemente llevo un registro del tiempo en segundos para manejar el rebote.

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

información relacionada