2016-12-08 3 views
1

im пытается создать BASH-скрипт, который будет постоянно работать в фоновом режиме. Этот скрипт bash должен запрашивать результат из команды rpi-cecd, и если он содержит 45:00, сделайте что-нибудь, и если он содержит 45:03, сделайте что-нибудь еще. Но на данный момент я не могу заставить скрипт работать, если я попрошу более одного результата.BASH | Если команда равна чему-то, иначе, если что-то делать

Рабочий код, но только просят 45:00

/home/rpi-cecd/rpi-cecd | grep -q "45:00" && ok 


Code Я пытался, но ничего не работает.

/home/rpi-cecd/rpi-cecd | grep '45' > /dev/null 
if [[ $? =~ .*45:00.* ]] 
then 
    echo "OK Button Clicked - HMS" 
    ok 
elif [ $? == *"45:03"* ] 
then 
    echo "Left Button Clicked - Canteen" 
    left 
else 
    echo "Nothing Clicked?" 
fi 

EDIT Я просто попытался это не повезло.

hhmm=$(/home/rpi-cecd/rpi-cecd) 
case "$hhmm" in 
     45[:]00) 
       ok 
       ;; 
     45[:]03) 
       left 
       ;; 
     *) 
       echo "don't know how to process $hhmm" 
       ;; 
esac 
+0

Как @Someprogrammerdude предлагает и по крайней мере использовать один и тот же квадрат стратегии кронштейн, если и Элиф (предлагается использовать удвоенные квадратные скобки в обоих). Это работает? – Dilettant

+0

Одна из проблем заключается в том, что '$?' - это код выхода * последней команды (обычно нуль для успеха, неотрицательный номер для отказа). Он не содержит результат вывода. Если вам нужен вывод команды 'grep', вам нужно его захватить. –

+0

'$?' - это статус возврата последнего выполненного CMD. Он всегда является целым числом, он не будет содержать ничего, как '45: 00'. Здесь много других проблем. Попробуйте свой первый cmd и сохраните его вывод в var, ile. 'hhmm = $ (rpi-cecd ...)'. Теперь сравните его с «case» $ hhmm »в 45 [:] 00) cmd1 ...; 45 [:] 03) cmd2 ... ;; *) echo "не знаю, как обрабатывать $ hhmm" ;; esac'. Удачи. – shellter

ответ

2

Если rpi-cecd работает непрерывно без выхода, вы не можете просто захватить его выход один раз. Вам нужно постоянно читать. Вы можете сделать это, поставив свой вывод на цикл while read.

/home/rpi-cecd/rpi-cecd | while IFS= read -r line; do 
    case $line in 
     *45:00*) 
      ok 
      ;; 
     *45:03*) 
      left 
      ;; 
     *) 
      echo "don't know how to process $line" 
      ;; 
    esac 
done 
+0

Это все еще не работает:/Забыл упомянуть, но эта команда похожа на хвост, она всегда пишет вещи на терминал, и когда я нажимаю кнопку «ОК» на пульте дистанционного управления телевизором, он записывает строку кода, содержащую 45:00. (Если это что-то меняет) –

0

Вы, возможно, придется очистить свой ответ перед их использованием:

payload= 
while read line;do 
    [ "$line" ] && [ -z "${line//*payload=*}" ] && payload=${line#*payload=[} 
    done < <(/home/rpi-cecd/rpi-cecd) 

case ${payload%%]*} in 
    *45:00) 
     echo payload 45oo 
     ;; 
    *45:03) 
     echo payload 45.3 
     ;; 
    *) 
     echo "other ("${payload%%]*}")..." 
     ;; 
    esac 
+0

Эта команда выводит «другое ...», а затем заканчивается, rpi-cecd имеет хвост и записывает только строку с 45: 0 ... когда команда запущена и нажимается кнопка на Пульт от телевизора. –

+0

Итак, вы должны прочитать весь вывод 'rpi-cecd', чтобы найти * полезную нагрузку *. –

 Смежные вопросы

  • Нет связанных вопросов^_^