Wprowadzenie
Witamy w trzeciej części "Poradnika dla początkujących do BASH". Jeśli pominąłeś poprzednie dwa artykuły, prawdopodobnie będziesz chciał wiedzieć, co sprawia, że ten przewodnik różni się od innych instrukcji obsługi skryptów BASH.
Ten przewodnik jest pisany przez początkującego do BASH i jako czytelnik uczysz się jak się uczę. Chociaż jestem początkującym dla BASH, pochodzę z tła programistycznego, chociaż większość rzeczy, które napisałem, dotyczy platformy Windows.
Możesz zobaczyć pierwsze dwa przewodniki, odwiedzając:
- Przewodnik dla początkujących w BASH - Hello World
- Przewodnik dla początkujących do BASH - Parametry wejściowe
Jeśli jesteś początkującym skryptem BASH, polecam lekturę pierwszych dwóch poradników, zanim przejdziesz dalej.
W tym przewodniku podkreślam, jak używać instrukcji warunkowych do testowania danych wprowadzanych przez użytkownika i kontrolowania działania skryptu.
Zainstaluj rsstail
Aby postępować zgodnie z tym przewodnikiem, musisz zainstalować aplikację wiersza poleceń o nazwie rsstail, która służy do odczytywania kanałów RSS.
Jeśli używasz dystrybucji opartej na Debianie / Ubuntu / Mint, wykonaj następujące czynności:
sudo apt-get install rsstail
W Fedorze / CentOS itp. Wpisz:
yum zainstaluj rsstail
Dla openSUSE wpisz:
zypper install rsstail
Instrukcja IF
Otwórz terminal i utwórz plik o nazwie rssget.sh, wpisując:
sudo nano rssget.sh
W edytorze nano wpisz następujący tekst:
#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Zapisz plik, naciskając CTRL i O, a następnie wyjdź, naciskając klawisze CTRL i X.
Uruchom skrypt, wpisując:
sh rssget.sh
Skrypt zwróci listę tytułów z kanału RSS linux.about.com.
Nie jest to zbyt użyteczny skrypt, ponieważ po prostu pobiera tytuły z jednego kanału RSS, ale zapisuje, że musi zapamiętać ścieżkę do kanału RSS Linux.about.com.
Ponownie uruchom skrypt rssget.sh w nano i edytuj plik, aby wyglądał następująco:
#! / bin / bash
jeśli $ 1 = "verbose"następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Uruchom skrypt ponownie, wpisując:
sh rssget.sh verbose
Tym razem kanał RSS powraca z tytułem, linkiem i opisem.
Przeanalizujmy skrypt nieco szczegółowo:
#! / Bin / bash pojawia się w każdym pisanym przez nas skrypcie. Następna linia w zasadzie patrzy na pierwszy parametr wejściowy dostarczony przez użytkownika i porównuje go ze słowem "verbose". Jeśli parametr wejściowy i słowo "verbose" pasują do linii między następnie i fi są uruchomione.
Powyższy skrypt jest oczywiście wadliwy. Co się stanie, jeśli w ogóle nie wprowadzisz parametru wejściowego? Odpowiedź brzmi: otrzymujesz błąd wzdłuż linii niespodziewanego operatora.
Inną poważną wadą jest to, że jeśli nie podasz słowa "verbose", nic się nie dzieje. Idealnie, jeśli nie podasz słowa verbose, skrypt zwróci listę tytułów.
Ponownie użyj nano, aby edytować plik rssget.sh i zmień kod w następujący sposób:
#! / bin / bash
jeśli $ 1 = "verbose"następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Zapisz plik i uruchom go, wpisując:
sh rssget.sh verbose
Pojawi się lista tytułów, opisów i linków. Teraz uruchom go ponownie w następujący sposób:
sh rssget.sh tytułów
Tym razem pojawia się tylko lista tytułów.
Dodatkowa część skryptu znajduje się na linii 4 i wprowadza znak jeszcze komunikat. Zasadniczo skrypt mówi teraz, że jeśli pierwszym parametrem jest słowo "verbose", uzyskaj opis, linki i tytuły dla kanału RSS, ale jeśli pierwszym parametrem jest cokolwiek innego, po prostu uzyskaj listę tytułów.
Scenariusz poprawił się nieznacznie, ale nadal jest wadliwy. Jeśli nie wprowadzisz parametru, nadal będziesz otrzymywać błąd. Nawet jeśli podajesz parametr, po prostu mówienie, że nie chcesz gadać, nie oznacza, że chcesz tylko tytuły. Być może właśnie napisałeś błędnie verbose lub możesz wpisać gołębie, co oczywiście nie ma znaczenia.
Zanim spróbujemy usunąć te problemy, chcę pokazać jeszcze jedną komendę zgodną z instrukcją IF.
Edytuj swój skrypt rssget.sh, aby wyglądał następująco:
#! / bin / bash
jeśli $ 1 = "wszystkie"następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "opis"następnie rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Postanowiłem pozbyć się słowa verbose i zastąpiłem je wszystkim. To nie jest ważna część. Powyższy skrypt wprowadza elif co jest krótkim sposobem na wypowiedzenie ELSE IF.
Teraz skrypt działa w następujący sposób. Jeśli biegniesz sh rssget.sh all otrzymasz opisy, linki i tytuły. Jeśli zamiast tego po prostu uciekasz sh Opis rssget.shotrzymasz tylko tytuły i opisy. Jeśli podasz jakiekolwiek inne słowo, otrzymasz listę tytułów.
Wprowadza to sposób szybkiego wymyślania listy instrukcji warunkowych. Alternatywnym sposobem wykonywania ELIF jest użycie tak zwanych zagnieżdżonych instrukcji IF.
Poniżej znajduje się przykład pokazujący, jak zagnieżdżone instrukcje IF działają:
#! / bin / bash
jeśli $ 2 = "aboutdotcom"następnie jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" następnie rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fijeszcze jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" następnie rsstail -d -u http://lxer.com/module/newswire/headlines.rss jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Możesz je wpisać, jeśli chcesz, lub skopiuj i wklej do pliku rssget.sh.
Powyższy skrypt wprowadza drugi parametr, który pozwala wybrać kanał "about.com" lub "lxer.com" kanałem RSS.
Aby go uruchomić, wpisz:
sh rssget.sh all aboutdotcom
lub
sh rssget.sh wszystkie lxer
Można oczywiście zastąpić wszystkie opisy lub tytuły, aby podać tylko opisy lub tylko tytuły.
Zasadniczo powyższy kod mówi, że jeśli drugim parametrem jest aboutdotcom, to spójrz na drugą instrukcję if, która jest taka sama z poprzedniego skryptu, jeśli drugi parametr to lxer, następnie spójrz na wewnętrzną instrukcję if, aby zdecydować, czy wyświetlić tytuły, opisy lub wszystko.
Skrypt ten jest dostarczany wyłącznie jako przykład zagnieżdżonej instrukcji IF, a w przypadku tego skryptu jest tak wiele rzeczy błędnych, że potrzeba by innego artykułu, aby je wszystkie wyjaśnić. Głównym problemem jest to, że nie jest skalowalny.
Wyobraź sobie, że chcesz dodać kolejny kanał RSS, taki jak Everyday Linux User lub Linux Today? Skrypt stałby się ogromny i gdybyś zdecydował, że chcesz zmienić wewnętrzną instrukcję IF, musisz zmienić ją w wielu miejscach.
Chociaż jest czas i miejsce na zagnieżdżone IF, powinny one być używane oszczędnie. Zwykle istnieje sposób na refaktorowanie kodu, aby w ogóle nie potrzebować zagnieżdżonego IF. Przejdę do tego tematu w przyszłym artykule.
Spójrzmy teraz na naprawę problemu osób wchodzących w parametry duff. Na przykład w powyższym skrypcie, jeśli użytkownik wprowadzi coś innego niż "aboutdotcom" jako drugi parametr, wtedy lista artykułów pojawi się z kanału RSS z LXER niezależnie od tego, czy użytkownik wprowadzi lxer czy nie.
Ponadto, jeśli użytkownik nie wprowadzi "wszystkich" ani "opisu" jako pierwszego parametru, domyślnie jest to lista tytułów, które mogą być lub nie są zamierzone przez użytkownika.
Spójrz na poniższy skrypt (lub skopiuj go i wklej do pliku rssget.sh.
#! / bin / bash
jeśli $ 2 = "aboutdotcom" || 2 USD = "lxer"następnie jeśli $ 1 = "wszystkie" || $ 1 = "opis" || $ 1 = "tytuł" następnie jeśli $ 2 = "aboutdotcom" następnie jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" następnie rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi jeszcze jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" następnie rsstail -d -u http://lxer.com/module/newswire/headlines.rss jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że skrypt jest teraz dość duży i można szybko zobaczyć, w jaki sposób mogą stać się niekontrolowane zagnieżdżone instrukcje IF.
Bity, które są ważne w tym skrypcie, to instrukcja JEŻELI || wypowiedzieć TO sekcję na linii 2 i linii 4.
The || oznacza OR. A więc liniajeśli $ 2 = "aboutdotcom" || 2 USD = "lxer"sprawdza, czy drugi parametr jest równy "aboutdotcom" lub "lxer". Jeśli tak nie jest, instrukcja IF jest kompletna, ponieważ nie ma jeszcze oświadczenie dla najbardziej zewnętrznych JEŚLI.
Podobnie na linii 4 linii jeśli $ 1 = "wszystkie" || $ 1 = "opis" || $ 1 = "tytuł"sprawdza, czy 1. parametr jest równy "wszystkie" lub "opis" lub "tytuł".
Teraz, jeśli użytkownik uruchomish rssget.sh ser ziemniakinic nie jest zwracane, a przed otrzymaniem listy tytułów z LXER.
Przeciwieństwo || jest &&. Operator && oznacza AND.
Zamierzam sprawić, aby scenariusz wyglądał jeszcze bardziej jak koszmar, ale to wszystko sprawdzi, czy użytkownik dostarczył 2 parametry.
#! / bin / bash
jeśli $ # -eq 2następnie
jeśli $ 2 = "aboutdotcom" || 2 USD = "lxer" następnie jeśli $ 1 = "wszystkie" || $ 1 = "opis" || $ 1 = "tytuł" następnie jeśli $ 2 = "aboutdotcom" następnie jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" następnie rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi jeszcze jeśli $ 1 = "wszystkie" następnie rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" następnie rsstail -d -u http://lxer.com/module/newswire/headlines.rss jeszcze rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Jedyny bit, który jest dodatkowy w tym skrypcie, jest następną zewnętrzną instrukcją IF w następujący sposób:jeśli $ # -eq 2. Jeśli przeczytasz artykuł o parametrach wejściowych, będziesz wiedział, że $ # zwraca liczbę parametrów wejściowych. Eq oznacza równe. Dlatego instrukcja IF sprawdza, czy użytkownik wprowadził 2 parametry, a jeśli tak się nie stało, to po prostu wychodzi bez robienia czegokolwiek. (Niezbyt przyjazny).
Mam świadomość, że ten samouczek jest coraz większy. W tym tygodniu nie ma wiele do omówienia, ale chcę pomóc w uporządkowaniu skryptu, zanim skończymy.
Ostatnim poleceniem, które musisz poznać na temat instrukcji warunkowych, jest instrukcja CASE.
#! / bin / bash
jeśli $ # -eq 2następnie Przypadek 2 USD w aboutdotcom) Przypadek 1 USD w wszystko) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; opis) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; tytuł) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) Przypadek 1 USD w wszystko) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; opis) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; tytuł) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Oświadczenie w sprawie sprawy jest ładniejszym sposobem na napisanie JEŚLI ELSE JEŚLI ELSE JEŚLI ELSE JEŚLI. Na przykład ta logika JEŚLI owoc = bananyWtedy toELSE JEŚLI owoc = pomarańczeWtedy toELSE IF owoc = winogronaWtedy toEND IF można przepisać jako: owoc skrzynki w banany) Zrób to ;; pomarańcze) Zrób to ;; winogrona) Zrób to ;;esac Zasadniczo pierwszym przedmiotem po sprawie jest to, co masz zamiar porównać (np. Owoc). Następnie każdy element przed nawiasami jest przedmiotem porównywania i jeśli pasuje do linii poprzedzających ;; zostanie uruchomiony. Oświadczenie sprawy jest zakończone zwrotnym esac (który jest odwrócony). W skrypcie rssget.sh instrukcja case usuwa niektóre z tych okropnych zagnieżdżeń, chociaż nie poprawiają one w wystarczającym stopniu. Aby naprawdę ulepszyć skrypt, muszę przedstawić wam zmienne. Spójrz na następujący kod: #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" jeśli $ # -lt 2 || $ # -gt 2następnie echo "użycie: rssget.sh all | description | title aboutdotcom | lxer"; wyjście;fi Przypadek 1 USD w wszystko) display = "- d -l -u" ;; opis) display = "- d -u" ;; tytuł) display = "- u" ;;esac Przypadek 2 USD w aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url; Zmienna jest definiowana przez nadanie jej nazwy, a następnie przypisanie jej wartości. W powyższym przykładzie są to przypisania zmiennych: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" Skrypt jest natychmiast bardziej zarządzalny dzięki użyciu zmiennych. Na przykład każdy parametr jest obsługiwany osobno i dlatego nie ma zagnieżdżonych instrukcji IF. Zmienna wyświetlana jest teraz ustawiona w zależności od tego, czy wybrałeś wszystko, opis czy tytuł, a zmienna adresu URL jest ustawiona na wartość zmiennej aboutdotcom lub wartość zmiennej lxer w zależności od tego, czy wybierzesz opcję aboutotot czy lxer. Polecenie rsstail musi teraz po prostu używać wartości ekranu i adresu URL do poprawnego działania. Podczas gdy zmienne są ustawiane tylko przez nadanie im nazwy, aby faktycznie z nich skorzystać, musisz umieścić znak $ przed nimi. Innymi słowy: zmienna = wartość ustawia zmienną na wartość, podczas gdy zmienna $ oznacza zawartość zmiennej. Poniżej znajduje się ostateczny skrypt do tego samouczka. #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"everyonelinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"usage = "usage: rssget.sh all | description | title lxer | aboutdotcom | everyonelinuxuser | linuxtoday"display = ""url = "" jeśli $ # -lt 2 || $ # -gt 2następnie echo $ użycie; wyjście;fi Przypadek 1 USD w wszystko) display = "- d -l -u" ;; opis) display = "- d -u" ;; tytuł) display = "- u" ;; *) echo $ użycie; wyjście; ;;esac Przypadek 2 USD w aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everyonelinuxuser) url = $ everyonelinuxuser; ;; *) echo $ użycie; wyjście;esac rsstail $ display $ url; Powyższy skrypt wprowadza więcej kanałów RSS i istnieje zmienna użycia, która mówi użytkownikowi, jak korzystać ze skryptu, jeśli nie wprowadzają 2 zmiennych lub wprowadzają nieprawidłowe opcje dla zmiennych. To był epicki artykuł i może zbyt szybko zaszło. W następnym przewodniku pokażę wszystkie opcje porównania dla instrukcji IF i wciąż jest o wiele więcej do omówienia w odniesieniu do zmiennych. Jest jeszcze wiele do zrobienia, aby ulepszyć powyższy skrypt, a to zostanie omówione w przyszłych przewodnikach, gdy będziemy eksplorować pętle, grep i wyrażenia regularne. Zobacz sekcję How To (przewiń w dół obok kategorii, aby wyświetlić listę artykułów) w sekcji linux.about.com, aby znaleźć więcej przydatnych poradników, od podwójnego uruchamiania systemów Windows i Ubuntu po konfigurowanie maszyny wirtualnej za pomocą okien GNOME. streszczenie