Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Бесконечный цикл на bash с условиями  (Прочитано 5128 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Доброго времени суток)
***
Задача простая, но решение её мне (новичку :-[) дается с трудом.
Понадобилось написать скрипт по алгоритму:
1)запускается скрипт с бесконечным циклом и переменной line=0
2)выполняется уловие CASE:
     если ввели 0, то сообщение "code 0"
     если ввели 1, то сообщение "code 1"
     если ввели 2, то сообщение "code 2"
     если ввели 3, то сообщение "code 3" и выход из бесконечного цикла
     если ввели <что-то другое>, то сообщение "code unknown"
3)далее чтение из строки: ввожу цифру жму Enter и цикл отрабатывает дальше, а если ничего не ввел и не нажал Enter ,то цикл не останавливается и не ждет ввода, а продолжает дальше, помня в переменной line предыдущий ввод цифры.

Реализовал это в таком виде, но никак не могу обойти ожидание ввода read line :-\
#!/bin/bash
line=0
run=1
while [[ "$run" -q 1 ]];
 do
  case $line in
  0) echo "code 0";;
  1) echo "code 1";;
  2) echo "code 2";;
  3) echo "code 3"; exit; ;;
  *) echo "code unknonw";;
  esac
  sleep 1
  read line   #пока не тыкну Enter цикл не продолжится, а надо чтобы продолжился
done
Буду благодарен за любые советы, извините если чего-то простого не понимаю может-быть :-[

Оффлайн Сперанский

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4055
  • Dictum ac factum
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #1 : 06 Февраля 2013, 12:39:45 »
В read можно задать сколько символов ждать в переменную, то есть у вас должно быть так:
read -n 1 line

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #2 : 06 Февраля 2013, 13:13:06 »
В read можно задать сколько символов ждать в переменную, то есть у вас должно быть так:
read -n 1 line

Спасибо) помогло наполовину, теперь Enter вводить уже не надо, реагирует на ввод цифры,
но все равно необходимо что-то вводить, т.е. цикл останавливается и ждет ввод цифры,
а надо чтобы постоянно генерил
# Запуск скрипта, и сразу
code 0
code 0
code 0
...
#теперь ввожу 2 ,а цикл при это работает и отрабатывет условие
code 2
code 2
code 2
...
#теперь ввожу 3 ,а цикл при это работает и отрабатывет условие
code 3
выход из цикла


Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28429
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #3 : 06 Февраля 2013, 13:57:29 »
man bash
?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Сперанский

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4055
  • Dictum ac factum
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #4 : 06 Февраля 2013, 14:24:58 »
fshlik,
Сделайте вместо echo 0 бесконечный цикл в фоне, вам же не нужно будет в реальной задаче выводить инфу в терминал?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #5 : 06 Февраля 2013, 15:41:22 »
ТС, Ваша задача требует 2 потока (процесса).
В первом - ожидание ввода и передача его в переменную.
Во втором - тупой вывод переменной.
« Последнее редактирование: 06 Февраля 2013, 15:44:27 от alexander.pronin »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Бесконечный цикл на bash с условиями
« Ответ #6 : 06 Февраля 2013, 16:52:16 »
Код: (bash) [Выделить]
CODE="0" ; while : ; do read -n1 -s -t1 LINE && CODE="$LINE" ; case "$CODE" in [0-2]) echo "$CODE" ;; 3) echo "$CODE" ; break ;; *) echo "unknown" ;; esac ; done
man bash
+1

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #7 : 06 Февраля 2013, 17:18:37 »
Код: (bash) [Выделить]
CODE="0" ; while : ; do read -n1 -s -t1 LINE && CODE="$LINE" ; case "$CODE" in [0-2]) echo "$CODE" ;; 3) echo "$CODE" ; break ;; *) echo "unknown" ;; esac ; done
Отличная реализация, но здесь не хватает
sleep 1
, чтобы не было "крутого" цикла.
ЗЫ. Еще обычно проверяют на изменение, чтобы не было лишних операций. Но это уже тема для размышления ТС.
« Последнее редактирование: 06 Февраля 2013, 17:25:34 от alexander.pronin »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Бесконечный цикл на bash с условиями
« Ответ #8 : 06 Февраля 2013, 17:23:05 »
Задержка реализована средствами read.
Если этого недостаточно, то можно и sleep воткнуть.

Оффлайн fshlik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Бесконечный цикл на bash с условиями
« Ответ #9 : 06 Февраля 2013, 17:47:57 »
Задержка реализована средствами read.
Если этого недостаточно, то можно и sleep воткнуть.
Спасибо за помощь))
Сейчас проверяю, работает так как задумывал.
Не знаю на сколько правильно придумал алгоритм, но работает.
Это мне для генератора разных последовательностей на COM-порт.
case "$CODE" in
1) echo -e -n "x\1" >/dev/ttyUSB0;;
2) echo -e -n "x\2" >/dev/ttyUSB0;;
3) echo "$CODE" ; break ;;
*) echo "unknown" ;;
esac;

 

Страница сгенерирована за 0.243 секунд. Запросов: 21.