
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