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!]:
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. ;]
Warto przeczytać.
Trwa ładowanie…