Problemem początkujących jest to, że traktują shell jak każdy inny język programowania — a tak nie jest. Poczytaj sobie
Advanced Bash-Scripting Guide. Wiele z początkowych rozdziałów ma zastosowanie do "zwykłego" sh.
W Twoim przypadku różnica polega na tym, że IF nie jest tym, czym się wydaje.
if POLECENIE
then
# blok, gdy wykonanie POLECENIE zakończy się kodem sukcesu
else
# blok, gdy wykonanie POLECENIE zakończy się kodem błędu
fi
Magia polega na tym, ze
if nie sprawdza warunku w rozumieniu
if z C/Pythona czy innego języka.
If w shellach uruchamia wskazany proces potomny i jedyne co robi, to sprawdza, czy zakończył się on błędem (
return w
main(){} zwrócił coś innego niż 0) czy sukcesem (
return w
main(){} zwrócił 0),
Polecenie
ping samo w sobie (poczytaj ostatnie akapity dokumentacji) zwraca w statusie informację, czy pojawiła się choć jedna odpowiedź, czy też nastąpił jakiś błąd (błędny adres, błąd routingu, całkowity brak odpowiedzi, itp).
Poczytaj sobie o poleceniu ping, jak uzyskać następujący zestaw efektów:
* Jak nic nie wyświetlać na ekranie (interesuje cię tylko wynik sukces/porażka zgłaszany jako status powrotu)
* Jak wysłać tylko konkretną liczbę pakietów (wygląda na LAN, więc powinny wystarczyć góra 2-3)
* Jak zakończyć ping wcześniej, gdy dostaniemy choć jedną pozytywną odpowiedź
Tu też twoja decyzja, czy rozdzielczość 1 minuty ci wystarczy (bo cron nie potrafi wołać częściej), czy chcesz bardziej real-time (i zrobić to w pętli z opóźnieniem między iteracjami, np 5 albo 10s)