Nowe posty

Autor Wątek: Działanie instrukcji warunkowej  (Przeczytany 1780 razy)

filon92

  • Gość
Działanie instrukcji warunkowej
« dnia: 2013-08-04, 10:16:07 »
Witam,

Mam następujące pytanie:
Jak działa instrukcja warunkowa, na tym konkretnym przykładzie:
if grep -x "$slowo" "$sciezka" > /dev/null
W jaki sposób grep przekazuje ifowi czy coś znalazł czy nie? Po strumieniu wyjścia? strumieniu błędów?
Z góry dziękuję za pomoc

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Działanie instrukcji warunkowej
« Odpowiedź #1 dnia: 2013-08-04, 10:36:44 »
[ciach]

if używa wartości zwracanej przez program (kojarzysz "return 0;" w main() w C/C++?).
Gdy grep coś znajdzie, zwraca 0, w przeciwnym razie 1. Każda wartość różna od 0 traktowana jest jako kod błędu.
.
Zwróconą przez program wartość możesz odczytać tuż po jego zakończeniu za pomocą zmiennej $? (również w skrypcie):
$ grep -x "$slowo" "$sciezka"
$ echo $?
$ grep -x jest plik.txt
jest
$ echo $?
0
$ grep -x nie-ma plik.txt
$ echo $?
1
.
Używając wartości zwracanej przez program możesz też łączyć komendy za pomocą instrukcji logicznych: && i ||
grep -x jest plik.txt && echo Znaleziono || echo Nie znaleziono
albo
! which jakisprogram && echo Program nie jest zainstalowany || jakisprogram
itd.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Działanie instrukcji warunkowej
« Odpowiedź #2 dnia: 2013-08-04, 12:03:43 »
@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 $? .
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

filon92

  • Gość
Działanie instrukcji warunkowej
« Odpowiedź #3 dnia: 2013-08-04, 13:17:32 »
Dziękuję za pomoc

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Działanie instrukcji warunkowej
« Odpowiedź #4 dnia: 2013-08-04, 13:36:28 »
@pkraszewski
Masz racje, widać byłem jeszcze zaspany. Oczywiście przy tej konstrukcji nie potrzeba już test-a. Usunąłem mylący fragment.