@ultr: polecenie Filona jest jak najbardziej poprawne. Za to Twoje całkowicie błędne. Co ciekawe, Twoje _wytłumaczenie_ jest poprawne.
W shellach instrukcja IF przyjmuje jeden parametr, będący poleceniem do wykonania. Wynik działania polecenia (czyli to, co polecenie zwraca w return z main() albo jego odpowiednika) decyduje, która gałąź IF się wykona. Jest tu na odwrót, niż w C. Jeżeli polecenie zwraca 0, to jest to sukces i wykona się gałąź THEN. Jeżeli polecenie zwraca wartość różną od zera, to wykonywana jest gałąź ELSE (jeżeli występuje).
A co do "if [ ... ]; then" - bajer polega na tym, że istnieje polecenie nazywające się [ (sprawdź w /bin). Inną nazwą tego polecenia jest test. Służy ono do testowania i porównywania zmiennych i obiektów na dysku (między innymi).
Wracając do pierwotnego pytania: if grep ... działa tak, że grep w kodzie zakończenia zwraca, czy znalazł szukany ciąg, czy nie. Przekierowanie do /dev/null sprawia, że wynik (pasujące linie) nie jest wyświetlany. Jeżeli chcesz sprawdzić w skrypcie kod zakończenia ostatniego polecenia, to zawsze siedzi on w zmiennej o nazwie $? .