Jak w łatwy sposób sterować przebiegiem skryptów – część 3

W pierwszej części kursu wspomniałem o tym, że Bash jest łatwym językiem i idealnie nadaje się do nauki podstaw programowania. Wymieniłem też jedną z ważniejszych zalet tego języka. Mowa o poleceniach wykonywanych w systemowym terminalu, których składnia jest jednakowa z językiem programowania Bash. Druga i równie ważna zaleta, to dostęp do szerokiej listy rozbudowanych programów. Jednym z takich programów jest Zenity omawiany w drugiej części kursu. Inny i dobrze znany program, to grep. Program na tyle przydatny i popularny, że dostępnych jest w każdej Linuksowej dystrybucji (wersji). Grep jest bardzo wygodnym narzędziem, a w połączeniu z operatorem &&, świetnie nadaje się do sterowania przebiegiem skryptów. Zapraszam na trzecią część kursu.
Zaczniemy tradycyjnie od teorii.
Program grep
Program grep służy m.in. do wyszukiwania ciągów znaków pasujących do wzorca. Wykorzystać go można też do instrukcji sterujących czyli sterowania przebiegiem skryptów.
Operatory && i ||
Znak && i ||, to logiczne operatory warunkowego wykonania poleceń, programu lub instrukcji.
Polecenie echo
Służy głównie do wyświetlania tekstu na ekranie. Można również wykorzystać je do zbudowania menu tekstowego programu, komunikatów błędów, przesłać ważne dane do pliku lub sterować przebiegiem programu. Zastosowań jest wiele, a to jak je wykorzystamy, zależy od umiejętności programisty.
Przykład wykorzystania programu grep w skrypcie
1 2 3 4 5 6 7 | #!/bin/bash LISTA_NAZWISK='Kowalski Nowak Wiśniewski' #Krótka lista najpopularniejszych nazwisk w Polsce. echo "$LISTA_NAZWISK" | grep -q 'Nowak' \ && echo 'Nazwisko Nowak jest na liście najpopularniejszych nazwisk w Polsce' \ || echo 'Nazwiska Nowak nie ma na liście najpopularniejszych nazwisk w Polsce ' |
Przykład wykorzystania programu grep w systemowym terminalu
echo 'Kowalski Nowak Wiśniewski' | grep 'Nowak' #Znajdź wyraz "Nowak" z listy nazwisk #W terminalu wyświetli się: Kowalski Nowak Wiśniewski | Nazwisko Nowak zostanie wyróżnione
echo -e 'Kowalski\nNowak\nWiśniewski' | grep 'Nowak' #Znajdź wyraz "Nowak" z listy nazwisk #W terminalu wyświetli się: Nowak
Objaśnienie
1. W linii nr 3, zmiennej LISTA_NAZWISK przypisaliśmy listę popularnych nazwisk występujących w Polsce.
2. W linii nr 5, polecenie echo wyświetla wartość zmiennej $LISTA_NAZWISK czyli w/w nazwiska. Dzięki operatorowi potoku | (pionowy znak) dane wyjściowe pochodzące z polecenia echo, wysłane zostają jako dane wejściowe dla programu grep. Program grep wyszukuje z listy nazwisko pasujące do wzorca czyli wyraz ‘Nowak’. Jeśli polecenie wyszukania zakończy się powodzeniem, zwracana zostaje wartość True (prawda) i wykonuje się wszystko po znaku &&. Jeśli jest inaczej tj. programowi grep nie udaje się odnaleźć nazwy pasującej do wzorca, zwracana zostaje wartość false (fałsz) i wykonane zostaje polecenie po znaku ||.
Opcja -q wyłącza wyświetlenie danych wyjściowych. Przydatne dla skryptów wykonywanych w terminalu. Usunięcie tej opcji nie spowoduje, że skrypt będzie działał nieprawidłowo, ale może źle wpłynąć na wygląd wyświetlanych wyników.
3. linia nr 6 i 7, to wspomniane na początku operatory warunkowe. Jeżeli pomiędzy wykonywanymi poleceniami (lub programami, instrukcjami) występuje operator &&, jest to informacja dla powłoki Bash, że drugie polecenie może wykonać się tylko wtedy, jeśli pierwsze zakończy się powodzeniem. Jeśli jest inaczej, powłoka zatrzymuje instrukcje lub wykonane zostaje wszystko po operatorze || (jeśli występuje).
Na koniec skrypt z wykorzystaniem omawianych w drugiej części kursu okien dialogowych
#!/bin/bash # Skrypt Nautilusa z wykorzystaniem okien dialogowych Zenity # usuwa nadmiar spacji i zamienia znak spacji na znak _ # wersja 0.1 # kontakt: luka.poland@gmail.com #Zmienna MENU przechowuje pełne nazwy zaznaczonych z listy opcji. MENU=$( zenity --width="500" --height="250" --title="Menu" --text="Lista opcji" \ --list --checklist --column="Wybór" --column="Opcje" --column="Opis" \ TRUE 'Usuń nadmiar spacji' 'Usuwa nadmiarowe spacje' \ FALSE 'Zamień spacje na znak _' 'Zastępuje znaki spacji znakiem _' ) for FILE in "$@" do echo "$MENU" | grep -q 'Usuń nadmiar spacji' \ && { mv "$FILE" "$( echo "$FILE" | tr -s '[ ]' '[ ]' )" ; FILE="$( echo "$FILE" | tr -s '[ ]' '[ ]' )" ; } echo "$MENU" | grep -q 'Zamień spacje na znak _' \ && mv "$FILE" "$( echo "$FILE" | tr ' ' '_' )" done
Uwagi, pytania, sugestie mile widziane. Zapraszam do dyskusji.







Małe uwagi od autora:
- zawsze należy się zabezpieczyć przy zmianie nazw plików sprawdzając czy przypadkiem plik o takiej nazwie już istnieje. Inaczej skutki będą opłakana. Polecam sprawdzić to na niepotrzebnych plikach.
- najlepszym narzędziem do znajdowania błędów i pisania skryptów, jest systemowy terminal.
- znak \ na końcach wierszy służy do ich łamania i zachowania czystości kodu źródłowego skryptu. Po znaku nie może znajdować się znak spacji, ponieważ powłoka zwróci błąd, a skrypt nie będzie działać.