Вы здесь

Не выключать, если ping

#!/bin/bash
while [ 1 ];do
ping -c 3 10.10.20.37
if [ $? != 0 ]
then
    ping -c 3 192.168.10.70
    if [ $? != 0 ]
    then
        poweroff
    fi
fi
done

почему второй, вложенный цикл не отрабатывает? Т.е. терпеливо отрабатывает, пока есть пинг по первому адресу и как только тот пропадает - вырубает комп, не глядя на то, что второй адрес пингуется. Еще раз - оба адреса нормально пингуются при включенных компах.

Ну видимо потому что в случае удачного пинга переменной просто не присваивается никакого значения, поэтому if проверяет значение еще от прошлого пинга. Сбрасывай переменную во втором цикле.

Немножко не понял логики. Если не присваивается, то почему первый цикл нормально отрабатывает? И кроме того, проверил, если удачный - 0, если неудачный (host unreachable) - 1

Я не знаток шэлл скриптов, но просто по логике - не равно 0 будет выполнятся всегда, когда в значении не стоит 0 или ничего. Т.е. когда переменная не задана, она также считается равной 0. Удачный результат видимо просто не возвращает кода ошибки, поэтому так и остается 1 от прошлого результата.
Сейчас пойду попроверяю свои доводы...

Нет, я был не прав видимо. У меня твой скрипт работает нормально. Если пинга по первому адресу нет, а по второму есть poweroff не срабатывает. Срабатывает только когда по обоим хостам нет пинга.

Вроде заработало, когда после первой строки поставил пустую строку, а в конце добавил 2(!) пустые. Что за магия, блин..

Вроде точку с запятой ставить надо после закрытия скобок ставить надо. Типа

#!/bin/bash
while [ 1 ];do
ping -c 3 10.10.20.37
if [ $? != 0 ]; then
    ping -c 3 192.168.10.70
    if [ $? != 0 ]; then
        poweroff
    fi
fi
done

Это если в одной строке следующее начинается...