
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