This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

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' or tar –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!]:
1
argc=$#

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

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

1
required=4

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

1
2
3
4
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:

1
2
3
4
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. ;]