
Я пытаюсь внедрить логику в свой скрипт, но, кажется, я что-то упустил, поскольку скрипт не срабатывает так, как должен.
Моя идея проста. Я хочу, чтобы скрипт отвечал на поток текста из другого исполняемого файла, запущенного в том же терминале, используя канал. Вывод выглядит так
Received 835186
Received 835186
over and over
Я пытался придумать логическую штуку, чтобы выбрать только один из них, а не все.
Вот мой код
#!/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
Ключевым моментом является изменение цикла while в 11 строках снизу текста, в который поступает информация.
Если я позволю себе покритиковать скрипт дальше, то, похоже, вы полагаетесь на файл /toggle, который создается и удаляется. Это кажется ужасным способом отслеживания состояния, и может быть более эффективно обслуживаться с помощью переменной. Как минимум, убедитесь, что файл TOGGLE имеет расширение файла и записывается/считывается на и с RAMDISK (например, /dev/shm в Ubuntu)
решение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