Introducere
Bine ați venit la a treia parte a "Ghidului pentru începători la BASH". Dacă ați pierdut cele două articole anterioare, probabil că veți dori să știți ce face acest ghid diferit față de alte ghiduri de scripting BASH.
Acest ghid este scris de un novice complet la BASH și astfel ca un cititor pe care îl învățați pe măsură ce învăț. În timp ce eu sunt un novice la BASH Eu provin de la un fond de dezvoltare software, deși cele mai multe lucruri pe care le-am scris a fost pentru platforma Windows.
Puteți vedea primele două ghiduri vizitând:
- Ghid de incepatori pentru BASH - Hello World
- Ghidul pentru începători la BASH - Parametrii de intrare
Dacă sunteți nou în scriptul BASH, vă recomandăm să citiți primele două ghiduri înainte de a continua cu acesta.
În acest ghid voi sublinia modul de utilizare a instrucțiunilor condiționale pentru a testa intrarea utilizatorilor și pentru a controla modul în care un script funcționează.
Instalați rsstail
Pentru a urma acest ghid, va trebui să instalați o aplicație de linie de comandă numită rsstail, care este utilizată pentru citirea fluxurilor RSS.
Dacă utilizați un tip de distribuție bazat pe Debian / Ubuntu / Mint următoarele:
sudo apt-get instala rsstail
Pentru Fedora / CentOS etc introduceți următoarele:
yum install rsstail
Pentru tipul openSUSE, următoarele:
zypper install rsstail
Instrucțiunea IF
Deschideți un terminal și creați un fișier numit rssget.sh introducând următoarele:
sudo nano rssget.sh
În cadrul editorului nano introduceți următorul text:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Salvați fișierul apăsând CTRL și O și apoi ieșiți apăsând CTRL și X.
Rulați scriptul tastând următoarele:
sh rssget.sh
Scriptul va returna o listă de titluri din feedul RSS pentru linux.about.com.
Nu este un script prea folositor, deoarece returnează titlurile dintr-un feed RSS dar salvează că trebuie să-și amintească calea către feedul RSS pentru Linux.about.com.
Deschideți din nou scriptul rssget.sh în Nano și editați fișierul după cum urmează:
#! / Bin / bash
dacă $ 1 = "verbose"atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;Fi
Rulați scriptul din nou introducând următoarele:
sh rssget.sh verbose
De data aceasta feedul RSS revine cu titlul, link-ul și descrierea.
Să analizăm scenariul în detaliu:
#! / Bin / bash apare în fiecare scenariu pe care îl scriem. Următoarea linie privește practic primul parametru de intrare furnizat de utilizator și îl compară cu cuvântul "verbose". Dacă parametrul de intrare și cuvântul "verbose" se potrivesc cu liniile între atunci și Fi sunt alergate.
Scriptul de mai sus este evident greșit. Ce se întâmplă dacă nu furnizați deloc un parametru de intrare? Răspunsul este că vă confruntați cu o eroare pe linia operatorului neașteptat.
Celălalt defect major este că, dacă nu oferiți cuvântul "verbose", atunci nimic nu se întâmplă deloc. În mod ideal, dacă nu oferiți cuvântul verbose, scriptul va returna o listă de titluri.
Utilizați din nou nano pentru a edita fișierul rssget.sh și modificați codul după cum urmează:
#! / Bin / bash
dacă $ 1 = "verbose"atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml;Fi
Salvați fișierul și executați-l tastând următoarele:
sh rssget.sh verbose
Va apărea o listă cu titluri, descrieri și linkuri. Acum rulați-o din nou după cum urmează:
sh rssget.sh titluri
De data aceasta apare o listă de titluri.
Partea extra a scriptului este pe linia 4 și introduce altfel afirmație. Practic, scriptul spune acum că dacă primul parametru este cuvântul "verbose" obțineți descrierea, link-urile și titlurile pentru feedul RSS, dar dacă primul parametru este altceva, obțineți doar o listă de titluri.
Scriptul sa îmbunătățit puțin, dar este încă defect. Dacă nu reușiți să introduceți un parametru, veți primi în continuare o eroare. Chiar dacă nu oferiți un parametru, doar spunând că nu doriți să faceți o verbose nu înseamnă că doriți doar titluri. S-ar putea ca tocmai ați spus greșeli greșite, de exemplu, sau ați putea să fi tastat porumbei care, desigur, nu are sens.
Înainte de a încerca să clarificăm aceste probleme, vreau să vă arăt încă o comandă care se referă la instrucțiunea IF.
Editați-vă scriptul rssget.sh pentru a arăta după cum urmează:
#! / Bin / bash
dacă $ 1 = "toate"atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "descriere"atunci rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml;Fi
M-am hotărât să scap de cuvântul verbose și l-am înlocuit cu totul. Aceasta nu este partea importantă. Scrierea de mai sus introduce Elif care este un mod scurt de a spune ELSE IF.
Acum scenariul funcționează după cum urmează. Dacă alergi sh rssget.sh toate atunci veți obține descrieri, link-uri și titluri. Dacă în schimb tocmai ați alerga SH descriere rssget.shveți obține titluri și descrieri. Dacă furnizați orice alt cuvânt, veți obține o listă de titluri.
Acest lucru introduce o modalitate de a veni rapid cu o listă de declarații condiționale. Un mod alternativ de a face ELIF este de a folosi ceea ce este cunoscut sub numele de declarații IF imbricate.
Următorul este un exemplu care arată modul în care funcționează instrucțiunile IF imbricate:
#! / Bin / bash
dacă $ 2 = "aboutdotcom"atunci dacă $ 1 = "toate" atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descriere" atunci rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fialtfel dacă $ 1 = "toate" atunci rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descriere" atunci rsstail -d -u http://lxer.com/module/newswire/headlines.rss altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; FiFi
Simțiți-vă liber să tastați toate aceste informații dacă vă place sau să le copiați și să le lipiți în fișierul rssget.sh.
Scriptul de mai sus introduce un al doilea parametru care vă permite să alegeți fie "about.com", fie "lxer.com" un feed RSS.
Pentru ao rula, tastați următoarele:
sh rssget.sh tot despredotcom
sau
sh rssget.sh toate lxer
Puteți înlocui, desigur, toate cu descrieri sau titluri pentru a oferi doar descrieri sau doar titluri.
În esență, codul de mai sus spune că dacă al doilea parametru este aboutdotcom, atunci uitați-vă la a doua instrucțiune if, care este aceeași cu cea din scriptul precedent, altfel dacă al doilea parametru este lxer, atunci aruncați o privire la declarația interioară din nou pentru a decide dacă să afișați titluri, descrieri sau totul.
Acest script este furnizat doar ca un exemplu al unei instrucțiuni IF imbricate și există multe lucruri în neregulă cu acest script, ar fi nevoie de un alt articol pentru a le explica pe toate. Problema principală este că nu este scalabilă.
Imaginați-vă că ați vrut să adăugați un alt flux RSS, cum ar fi Utilizatorul Linux de zi cu zi sau Linux Today? Scenariul ar deveni imens și dacă v-ați hotărât că doriți ca declarația internă IF să se schimbe, va trebui să o schimbați în mai multe locuri.
În timp ce există un timp și un loc pentru un IM imbrăcat, acestea ar trebui să fie folosite cu ușurință. Există de obicei o modalitate de a refactor codul dvs., astfel încât să nu aveți nevoie de IF imbricate deloc. Voi trece la acest subiect într-un articol viitor.
Să ne uităm acum la rezolvarea problemei persoanelor care intră în parametrii duff. De exemplu, în scriptul de mai sus dacă utilizatorul introduce altceva decât "aboutdotcom" ca al doilea parametru, atunci o listă de articole apare din feedul RSS de la LXER indiferent dacă utilizatorul introduce sau nu lxer.
În plus, în cazul în care utilizatorul nu introduce "toate" sau "descriere" ca parametru 1, atunci implicit este o listă de titluri care ar putea sau nu să fie ceea ce intenționează utilizatorul.
Uită-te la următorul script (sau copiați-l și lipiți-l în fișierul rssget.sh.
#! / Bin / bash
dacă $ 2 = "aboutdotcom" || $ 2 = "lxer"atunci dacă $ 1 = "toate" || $ 1 = "descriere" || $ 1 = "titlu" atunci dacă $ 2 = "aboutdotcom" atunci dacă $ 1 = "toate" atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descriere" atunci rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi altfel dacă $ 1 = "toate" atunci rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descriere" atunci rsstail -d -u http://lxer.com/module/newswire/headlines.rss altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi Fi FiFi
Primul lucru pe care trebuie să-l observați este că script-ul este acum destul de mare și puteți vedea rapid modul în care afară de control imbricate IF declarații pot deveni.
Bitul important în acest script este instrucțiunea IF || declarația de pe secțiunea 2 și linia 4.
| | | înseamnă OR. Deci liniadacă $ 2 = "aboutdotcom" || $ 2 = "lxer"verifică dacă al doilea parametru este egal cu "aboutdotcom" sau "lxer". Dacă nu este atunci instrucțiunea IF este completă deoarece nu există altfel declarație pentru cea mai mare parte DACĂ.
În mod similar, pe linia 4 linia dacă $ 1 = "toate" || $ 1 = "descriere" || $ 1 = "titlu"verifică dacă primul parametru este egal cu "toate" sau "descriere" sau "titlu".
Acum, dacă utilizatorul ruleazăsh rssget.sh brânză de cartofinimic nu este returnat, în timp ce înainte de a fi primit o listă de titluri de la LXER.
Opusul || este &&. Operatorul && reprezintă AND.
Am de gând să facă scenariul arata chiar mai mult ca un coșmar, dar face verificarea toate importante pentru a vă asigura că utilizatorul a furnizat 2 parametri.
#! / Bin / bash
dacă $ # -eq 2atunci
dacă $ 2 = "aboutdotcom" || $ 2 = "lxer" atunci dacă $ 1 = "toate" || $ 1 = "descriere" || $ 1 = "titlu" atunci dacă $ 2 = "aboutdotcom" atunci dacă $ 1 = "toate" atunci rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descriere" atunci rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi altfel dacă $ 1 = "toate" atunci rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descriere" atunci rsstail -d -u http://lxer.com/module/newswire/headlines.rss altfel rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi Fi Fi FiFi
Singurul bit care este suplimentar în acest script este o altă declarație IF exterioară după cum urmează:dacă $ # -eq 2. Dacă citiți articolul despre parametrii de intrare, veți ști că $ # returnează un număr de parametri de intrare. -Eq înseamnă egal. Instrucțiunea IF verifică, prin urmare, că utilizatorul introduce 2 parametri și dacă nu au ieșit doar fără să facă nimic. (Nu foarte prietenos).
Sunt conștient de faptul că acest tutorial devine destul de mare. Nu mai sunt multe de acoperit în această săptămână, dar vreau să ajut la ordonarea scenariului înainte de a termina.
Ultima comandă pe care trebuie să o cunoașteți despre declarațiile condiționate este instrucțiunea CASE.
#! / Bin / bash
dacă $ # -eq 2atunci caz în valoare de 2 USD aboutdotcom) caz $ 1 in toate) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; Descriere) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; titlu) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; ESAC ;; lxer) caz $ 1 in toate) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; Descriere) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titlu) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; ESAC ;; ESACFi
Declarația cazului este un mod mai plăcut de a scrie DACĂ ELSE DACĂ ELSE DACĂ ELSE IF. De exemplu, această logică Dacă fructele = bananeApoi astaELSE IF fruct = portocaleApoi astaELSE IF fruct = struguriApoi astaEND IF pot fi rescrise ca: carne de fructe banane) fa asta ;; portocale) fa asta ;; struguri) fa asta ;;ESAC Practic, primul element după caz este lucrul pe care îl veți compara (adică fructe). Apoi fiecare articol înaintea parantezelor este lucrul pe care îl comparați și dacă se potrivește cu liniile precedente ;; va fi fugit. O declarație de caz se încheie cu reversul esac (care este cazul înapoi). În scriptul rssget.sh, instrucțiunea de caz elimină o parte din acea îngrămădire îngrozitoare, deși nu o îmbunătățește cu adevărat suficient. Pentru a îmbunătăți într-adevăr scenariul, trebuie să vă prezint variabilele. Uită-te la următorul cod: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"afișare = „“url = "" dacă $ # -lt 2 || $ # -gt 2atunci echo "utilizare: rssget.sh toate | descriere | titlu aboutdotcom | lxer"; Ieșire;Fi caz $ 1 in toate) afișajul = "- d-l -u" ;; Descriere) afișaj = "- d -u" ;; titlu) afișare = "- u" ;;ESAC caz în valoare de 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;ESACrsstail $ afișare $ url; O variabilă este definită prin dându-i un nume și apoi atribuindu-i o valoare. În exemplul de mai sus, următoarele sunt asignări ale variabilelor: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"afișare = „“url = "" Scriptul este instantaneu mai ușor de administrat prin utilizarea variabilelor. De exemplu, fiecare parametru este tratat separat și deci nu există declarații IF imbricate. Variabila de afișare este acum setată în funcție de alegerea tuturor, descrierea sau titlul și variabila url este setată la valoarea variabilei aboutdotcom sau la valoarea variabilei lxer în funcție de alegerea lui aboutdotcom sau lxer. Comanda rsstail trebuie doar să utilizeze valoarea afișării și url pentru a rula corect. În timp ce variabilele sunt setate doar dându-le un nume, pentru a le folosi efectiv, trebuie să plasați un semn $ în fața lor. Cu alte cuvinte, variabila = valoarea seta variabila la o valoare, in timp ce variabila $ inseamna sa-mi dau continutul variabilei. Următorul este scriptul final pentru acest tutorial. #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"folosire = "utilizare: rssget.sh toate | descriere | titlu lxer | aboutdotcom | everydaylinuxuser | linuxtoday"afișare = „“url = "" dacă $ # -lt 2 || $ # -gt 2atunci echo $ usage; Ieșire;Fi caz $ 1 in toate) afișajul = "- d-l -u" ;; Descriere) afișaj = "- d -u" ;; titlu) afișare = "- u" ;; *) echo $ usage; Ieșire; ;;ESAC caz în valoare de 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; Ieșire;ESAC rsstail $ afișare $ url; Scriptul de mai sus introduce mai multe fluxuri RSS și există o variabilă de utilizare care spune utilizatorului cum să folosească scriptul dacă nu introduc două variabile sau introduc opțiuni incorecte pentru variabile. Acesta a fost un articol epic și poate că a trecut prea mult prea curând. În următorul ghid vă voi arăta toate opțiunile de comparare pentru instrucțiunile IF și mai sunt încă multe despre care să vorbim despre variabile. Există, de asemenea, mai multe care pot fi făcute pentru a îmbunătăți scenariul de mai sus și acest lucru va fi acoperit în ghidurile viitoare în timp ce explorăm bucle, expresii grep și regulat. Consultați secțiunea linux.about.com "Cum să faceți clic pe" (pentru a vedea lista articolelor) pentru a găsi mai multe ghiduri utile de la sistemul de pornire dublă Windows și Ubuntu la configurarea unei mașini virtuale utilizând casetele GNOME. rezumat