Bardzo często podczas pisania skryptów shellowych wykorzystywany jest interpreter bash - “Bourne-Again SHell”. Do jego skryptów, podobnie jak do zwykłych programów, możemy przekazać parametry wywołania. W dzisiejszym wpisie pokażę prosty sposób na odczytanie liczby tych parametrów i potencjalny sposób reakcji na związane z tym błędy.

Bash: Sprawdzanie liczby parametrów wejściowych.

Preferencje poszczególnych użytkowników są różne, ale bash to chyba najpopularniejsza powłoka systemowa dla systemów z rodziny GNU/Linux [ktoś się nie zgadza? nie słyszę? ;]]. Gdy uruchamiamy różne programy w konsoli, bardzo często widzimy, że zwracają one komunikaty błędów w przypadku nie dostarczenia wystarczającej liczby parametrów wywołania. Skrypty basha nie różnią się od nich pod tym względem - także pozwalają na przekazanie danych wejściowych, co tradycyjnie oznacza możliwość wystąpienia błędów w kolejnym miejscu.

Jeden z ciekawszych sposobów reagowania na niepoprawne wywołanie zawarty jest w programie tar, służącym do konsolowego tworzenia archiwów. W przypadku, kiedy nie zostaną przekazane do niego żadne informacje dotyczące plików, które ma spakować, “tchórząc, odmawia stworzenia pustego archiwum”:

tar -czf sth.tgz

tar: Cowardly refusing to create an empty archive Try tar --help' ortar –usage’ for more information.

Jak więc poradzić sobie z takim problemem w skrypcie basha?

Rozwiązanie: Zmienna $# i warunek if-then-fi.

Aby sprawdzić, ile argumentów zostało przekazanych do skryptu, należy użyć “magicznej” konstrukcji $#, oznaczającej rozmiar tablicy argumentów wejściowych [między nazwą zmiennej, znakiem równości a podstawianą wartością nie może być ani jednej spacji!]:

argc=$#

Zmienna argc będzie przechowywała wspomnianą liczbę.

Stwórzmy więc kolejną zmienną i podstawmy pod nią liczbę oczekiwanych parametrów [4]:

required=4

Na koniec wystarczy sprawdzić, czy liczby się zgadzają, i jeśli nie, wyświetlić błąd:

if [$argc -ne $required] then
  echo "[script] arg1 arg2 arg3 arg4"
  exit 1
fi

Możemy też oczywiście sprawdzić, czy przesłanych argumentów jest co najmniej tyle, ile potrzeba:

if [$argc -lt $required] then
  echo "[script] arg1 arg2 arg3 arg4"
  exit 1
fi

Mając tego typu zabezpieczenie możemy spać spokojnie - już nikt nie zrobi sobie krzywdy w naszym kodzie. A przynajmniej nie w ten sposób. ;]

Podsumowanie: Skrypty shellowe są… fajne. ;]

Dzisiejszy wpis był relatywnie prosty, aczkolwiek samo programowanie skryptów w bashu nie zawsze jest tak trywialne - składnia potrafi odstraszyć wielu zaawansowanych użytkowników komputerów. Nie zmienia to jednak faktu, że same skrypty shellowe to jedna z najpotężniejszych broni, jakiej możemy użyć “przeciwko” naszemu systemowi.

Tematykę tych skryptów wyciągam praktycznie zawsze na wierzch w rozmowach o teoretycznej wyższości “jedynego słusznego systemu” nad rodziną GNU/Linux. Do tej pory nikomu się nie udało obalić tego argumentu. ;]