Ghid de incepatori pentru BASH - Condiții și variabile

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:

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 / bash
rsstail -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"]
apoi
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 dintre acestea și fi rulate.

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"]
apoi
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 suplimentară a scriptului este pe linia 4 și introduce declarația else . 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"]
apoi
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descriere"]
apoi
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ă. Scenariul de mai sus introduce elif care este un mod scurt de a spune ELSE IF.

Acum scenariul funcționează după cum urmează. Dacă rulați sh rssget.sh tot atunci veți obține descrieri, link-uri și titluri. Dacă, în schimb, rulați doar descrierea sh rssget.sh, veț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"]
apoi
dacă [$ 1 = "toate"]
apoi
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descriere"]
apoi
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"]
apoi
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descriere"]
apoi
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

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"]
apoi
dacă [$ 1 = "toate"] || [$ 1 = "descriere"] || [$ 1 = "titlu"]
apoi
dacă [$ 2 = "aboutdotcom"]
apoi

dacă [$ 1 = "toate"]
apoi
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descriere"]
apoi
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"]
apoi
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descriere"]
apoi
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
Fi

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 linia dacă [$ 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ă nicio instrucțiune pentru cel mai exterior IF.

În mod similar, pe linia 4 linia dacă [$ 1 = "all"] || [$ 1 = "descriere"] || [$ 1 = "title"] verifică dacă primul parametru este egal cu "all" sau "description" sau "title".

Acum, dacă utilizatorul execută sh rssget.sh brânza de cartofi nimic 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 2]
apoi

dacă [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
apoi
dacă [$ 1 = "toate"] || [$ 1 = "descriere"] || [$ 1 = "titlu"]
apoi
dacă [$ 2 = "aboutdotcom"]
apoi

dacă [$ 1 = "toate"]
apoi
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descriere"]
apoi
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"]
apoi
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descriere"]
apoi
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
Fi
Fi

Singurul bit suplimentar în scriptul respectiv 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 2]
apoi
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
;;
ESAC
Fi

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 = banane
Apoi asta
ELSE IF fruct = portocale
Apoi asta
ELSE IF fruct = struguri
Apoi asta
END 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 scriptul, 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 2]
apoi
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;
;;
ESAC
rsstail $ 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 2]
apoi
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.

rezumat

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 de la How to (Scroll down past categories pentru a vedea o listă de articole) din l inux.about.com pentru a găsi mai multe ghiduri utile de la sistemul de pornire dublă Windows și Ubuntu pentru a configura o mașină virtuală utilizând casetele GNOME .