Бесконечный цикл while

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
farex
Сообщения: 497
ОС: Slackware 12.2, Archlinux

Бесконечный цикл while

Сообщение farex »

Помогите дописать скрипт.
Срипт должен бесконечно пинговать удлаленный хос, при удачном возвращении $? = 0 должен выдать сообщения Exit

Код: Выделить всё

#!/bin/bash
ping -s1 -c1 -i1 192.168.1.3
if [ "$?" = "1"  ]; then again=yes
while [ "$again" = "yes" ]
do
ping -s1 -c1 -i1 192.168.1.3
done
echo "Exit"
fi

Не пинайте если где накосячил, это мой мервый опыт написания скриптов...
Сыграем?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Спасибо сказали:
Аватара пользователя
Cra3y
Сообщения: 80
ОС: Debian

Re: Бесконечный цикл while

Сообщение Cra3y »

Можно проще:

Код: Выделить всё

#!/bin/sh
# подставьте ваш адрес
TGT='www.ya.ru'

while ! ping -c1 -s1 $TGT 2>&1 > /dev/null; do
  echo bad;
done;
echo Exit
HP G62 (AMD Phenom II x3 1.8GHz 4GB DDR3 Ram) / Debian 8 amd64
Спасибо сказали:
Аватара пользователя
farex
Сообщения: 497
ОС: Slackware 12.2, Archlinux

Re: Бесконечный цикл while

Сообщение farex »

#!/bin/sh
# подставьте ваш адрес
TGT='www.ya.ru'

while ! ping -c1 -s1 $TGT 2>&1 > /dev/null; do
echo bad;
done;
echo Exit

Если не затрудни не могли бы вы объяснить конструкцию.

Код: Выделить всё

while ! ping -c1 -s1 $TGT 2>&1 > /dev/null; do
  echo bad;
Сыграем?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: Бесконечный цикл while

Сообщение lava »

ещё такой вариант:

Код: Выделить всё

false; while [ "$?" -ne "0" ]; do ping -c1 -W1 192.168.1.3 &>/dev/null; done; echo Done


farex писал(а):
03.10.2009 18:30
Если не затрудни не могли бы вы объяснить конструкцию.

Проверяться будет сам код возврата функции ping. 0 возвращается только в случае успешного пинга. Правда, echo bad, мне кажется, вам там не надо.

TGT - переменная, в которой хранится адрес, который надо пинговать.


Кстати, в Вашем варианте, если именно его дорабатывать, надо дописывать проверку кода возврата и установку вашей управляющей переменной цикла в значение, отличное от "yes"
Спасибо сказали:
Аватара пользователя
farex
Сообщения: 497
ОС: Slackware 12.2, Archlinux

Re: Бесконечный цикл while

Сообщение farex »

false; while [ "$?" -ne "0" ]; do ping -c1 -W1 192.168.1.3 &>/dev/null; done; echo Done

тоже норм., в этом варианте мне все понятно.
Спс за разъяснения +)
Сыграем?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Спасибо сказали:
Аватара пользователя
Cra3y
Сообщения: 80
ОС: Debian

Re: Бесконечный цикл while

Сообщение Cra3y »

farex писал(а):
03.10.2009 18:30
Если не затрудни не могли бы вы объяснить конструкцию.

Код: Выделить всё

while ! ping -c1 -s1 $TGT 2>&1 > /dev/null; do
  echo bad;

while ! ping -c1 -s1 $TGT 2>&1 > /dev/null; do # Пока ping выполняется с ошибкой
echo bad; # Выводить 'bad'

Вместо $TGT подставляется содержимое переменной TGT
2>&1 > /dev/null является объединением stderr и stdout с перенаправлением в /dev/null (так я скрыл сообщения от ping)
HP G62 (AMD Phenom II x3 1.8GHz 4GB DDR3 Ram) / Debian 8 amd64
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: Бесконечный цикл while

Сообщение lava »

farex, кстати, порекомендую занятную штукенцию - libnotify.
В дебиане после установки пакета libnotify-bin появляется командочка

Код: Выделить всё

notify-send

которую очень удобно использовать, если хотите отвлечься от консольного окошка со скриптом.

Cra3y писал(а):
03.10.2009 18:47
2>&1 > /dev/null является объединением stderr и stdout с перенаправлением в /dev/null (так я скрыл сообщения от ping)

позволю себе немного откорректировать: перенаправляем stderr на stdout, а потом перенаправляем stdout в хлам.

не проще ли &>/dev/null ? или, возможно, этот вариант не переносим на не-bash интерпретаторы?
Спасибо сказали: