Bash делает то, что я хочу, а не синтаксическая ошибка

Bash делает то, что я хочу, а не синтаксическая ошибка

Я пытаюсь внедрить логику в свой скрипт, но, кажется, я что-то упустил, поскольку скрипт не срабатывает так, как должен.

Моя идея проста. Я хочу, чтобы скрипт отвечал на поток текста из другого исполняемого файла, запущенного в том же терминале, используя канал. Вывод выглядит так

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

Связанный контент