Uvod
Dobrodošli v tretjem delu "Vodič za začetnike BASH". Če ste izpustili prejšnja dva članka, boste verjetno želeli vedeti, kaj naredi ta vodnik drugačen od drugih BASH skriptnih vodnikov.
Ta priročnik je napisan s popolno novico BASH in tako kot bralec, ki ga učite, ko se učim. Medtem ko sem novinar BASH sem prišel iz razvoja programske opreme ozadja, čeprav je večina stvari, ki sem jih napisal, za platformo Windows.
Prva dva vodnika si lahko ogledate tako, da obiščete:
- Začetni vodič za BASH - Hello World
- Začetni vodnik BASH - Vhodni parametri
Če ste novi v skripti BASH, priporočam branje prvih dveh vodnikov, preden nadaljuje s tem.
V tem vodniku bom poudaril, kako uporabljati pogojne izjave za testiranje uporabniških vnosov in za nadzor delovanja skripta.
Namesti rsstail
Če želite slediti tem priročniku, boste morali namestiti aplikacijo za ukazno vrstico, imenovano rsstail, ki se uporablja za branje RSS virov.
Če uporabljate distribucijsko vrsto Debian / Ubuntu / Mint, uporabite naslednje:
sudo apt-get namestite rsstail
Za Fedora / CentOS etc vnesite naslednje:
yum namestite rsstail
Za OpenSUSE vnesite naslednje:
namestitev zypper rsstail
Izjava IF
Odprite terminal in ustvarite datoteko rssget.sh, tako da vnesete naslednje:
sudo nano rssget.sh
V nano urejevalniku vnesite naslednje besedilo:
#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Shranite datoteko tako, da pritisnete CTRL in O in nato zapustite s pritiskom na CTRL in X.
Zaženite skript tako, da vnesete naslednje:
sh rssget.sh
Skript bo vrnil seznam naslovov iz vira RSS linux.about.com.
To ni pretirano uporaben scenarij, ker samo ustvarja naslove iz enega vira RSS, vendar pa prihrani potrebo po zapomniti poti do RSS.vodja Linux.about.com.
Ponovno odprite skript rssget.sh v nano in uredite datoteko, da si ogledate na naslednji način:
#! / bin / bash
če je $ 1 = "verbose"potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Znova zaženite skript, tako da vnesete naslednje:
sh rssget.sh verbose
Tokrat se RSS vrača z naslovom, povezavo in opisom.
Analiziramo skript v nekaj podrobnostih:
V vsakem skriptu, ki ga pišemo, se prikaže #! / Bin / bash. Naslednja vrstica v bistvu obravnava prvi vhodni parameter, ki ga zagotovi uporabnik, in ga primerja z besedo "verbose". Če vhodni parameter in beseda "verbose" ustrezata vrsticam med potem in fi tečejo.
Navedeni scenarij je očitno pomanjkljiv. Kaj se zgodi, če sploh ne boste zagotovili vhodnega parametra? Odgovor je, da dobite napako vzdolž linije nepričakovanega operaterja.
Druga glavna pomanjkljivost je, da če ne navedete besede "verbose", se sploh ne zgodi nič. V idealnem primeru, če ne navedete besede verbose skript bi vrnil seznam naslovov.
Za urejanje datoteke rssget.sh ponovno uporabite nano in spremenite kodo na naslednji način:
#! / bin / bash
če je $ 1 = "verbose"potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Shranite datoteko in jo zaženite tako, da vnesete naslednje:
sh rssget.sh verbose
Pojavi se seznam naslovov, opisi in povezav. Zdaj znova zaženite na naslednji način:
sh rssget.sh naslovov
Tokrat se prikaže le seznam naslovov.
Dodatni del scenarija je v vrstici 4 in uvaja drugače izjavo. V bistvu skripta zdaj pravi, če je prvi parameter beseda "verbose", da dobite opis, povezave in naslove za vir RSS, a če je prvi parameter kaj drugega, dobite seznam naslovov.
Pisava se je nekoliko izboljšala, vendar je še vedno pomanjkljiva. Če ne vnesete parametra, boste še vedno dobili napako. Tudi če ste zagotovili parameter, samo s tem, da ne želite, da verbose ne pomeni, da želite samo naslove. Morda ste pravkar napisali napačno napačno, na primer, ali ste vnesli golobe, kar je seveda brez pomena.
Preden poskušamo odpraviti te težave, vam želim pokazati še en ukaz, ki je povezan s stavkom IF.
Uredite svoj rssget.sh skript, da si ogledate na naslednji način:
#! / bin / bash
če je $ 1 = "vse"potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "opis"potem rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Odločil sem se, da se znebim te besede in ga zamenjam z vsemi. To ni pomemben del. Spodnji skript uvaja elif kar je kratek način reči ELSE IF.
Zdaj scenarij deluje na naslednji način. Če pobegneš sh rssget.sh vse potem dobite opise, povezave in naslove. Če namesto tega preprosto zaženete sh rssget.sh opisboste dobili samo naslove in opise. Če pošljete katero koli drugo besedo, boste dobili seznam naslovov.
To uvaja način, kako hitro pripraviti seznam pogojnih izjav. Nadomestni način delovanja ELIF-a je, da uporabite tisto, kar je znano kot gnezdene stavke IF.
Naslednji primer prikazuje, kako deluje ugnezdeni stavki IF:
#! / bin / bash
če je $ 2 = "aboutdotcom"potem če je $ 1 = "vse" potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" potem rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fidrugače če je $ 1 = "vse" potem rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" potem rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Vzemite vse, če želite, ali kopirajte in prilepite v datoteko rssget.sh.
Zgornji scenarij uvaja drugi parameter, ki vam omogoča izbiro "o.com" ali "lxer.com" RSS.
Če ga želite zagnati, vnesite naslednje:
sh rssget.sh all aboutdotcom
ali
sh rssget.sh vse lxer
Seveda lahko seveda nadomestite vse z opisi ali naslovi, da zagotovite samo opise ali samo naslove.
V bistvu zgornja koda kaže, če je drugi parameter okrogdotcom, nato pa pogled na drugo, če je izjava, ki je ista iz prejšnjega skripta drugega, če je drugi parameter lxer, potem pa ponovno pogledajte notranji, če izjavo ponovno odločite, ali želite prikazati naslove, opise ali vse.
Ta scenarij je na voljo zgolj kot primer gnezdenega stavka IF in toliko stvari je narobe s tem skriptom, da bi potrebovali še en članek, ki bi jih razložil. Glavna težava je, da ni prilagodljiva.
Predstavljajte si, da želite dodati še en vir RSS, kot je vsakodnevni uporabnik Linuxa ali Linux danes? Skripta bi postala ogromna in če bi se odločila, da želite spremeniti notranjo izjavo IF, jo boste morali spremeniti na več mestih.
Čeprav obstaja čas in kraj za gnezdeno, če jih je treba uporabljati zmerno. Običajno obstaja način, kako spremeniti kodo, tako da sploh ne potrebujete gnezdenega IF-ja. Prišel bom na to temo v prihodnjem članku.
Poglejmo zdaj vprašanje, kako se ljudje vnesejo v parametre duff. Na primer, v zgornjem skriptu, če uporabnik vnese nekaj drugega kot "aboutdotcom" kot drugi parameter, se v seznamu RSS iz LXER prikaže seznam člankov, ne glede na to, ali uporabnik vnese lxer ali ne.
Poleg tega, če uporabnik ne vnese "vse" ali "opis" kot prvi parameter, je privzeto seznam naslovov, ki jih lahko uporabnik namerava ali ne.
Oglejte si naslednji scenarij (ali ga kopirajte in prilepite v datoteko rssget.sh.
#! / bin / bash
če je $ 2 = "aboutdotcom" || $ 2 = "lxer"potem če je $ 1 = "vse" || $ 1 = "opis" || $ 1 = "naslov" potem če je $ 2 = "aboutdotcom" potem če je $ 1 = "vse" potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" potem rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi drugače če je $ 1 = "vse" potem rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" potem rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Prva stvar, ki jo je treba opozoriti, je, da je scenarij precej velik in da lahko hitro ugotovite, kako lahko iz kontrolnih ugnezdenih stavkov IF postanejo.
Bit, ki je pomemben v tem skriptu, je stavka IF || izjava THEN oddelka o vrstici 2 in 4. vrstici.
|| stoji za OR. Torej črtoče je $ 2 = "aboutdotcom" || $ 2 = "lxer"preveri, ali je 2. parameter enak "aboutdotcom" ali "lxer". Če ni, potem je IF izjava popolna, ker ni drugače izjava za zunanje ČE.
Podobno na vrstici 4 črto če je $ 1 = "vse" || $ 1 = "opis" || $ 1 = "naslov"preveri, ali je 1. parameter enako "vse" ali "opis" ali "naslov".
Zdaj, če se uporabnik zaženesh rssget.sh krompirjev sirnič se ne vrne, preden bi prejeli seznam naslovov iz LXER.
Nasprotno od || je &&. Operater && stoji za AND.
Skripta bo izgledal bolj kot nočna mora, vendar naredi vse pomembne čeke, da se prepriča, da je uporabnik zagotovil 2 parametra.
#! / bin / bash
če je $ # -eq 2potem
če je $ 2 = "aboutdotcom" || $ 2 = "lxer" potem če je $ 1 = "vse" || $ 1 = "opis" || $ 1 = "naslov" potem če je $ 2 = "aboutdotcom" potem če je $ 1 = "vse" potem rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" potem rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi drugače če je $ 1 = "vse" potem rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" potem rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugače rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Edini bit, ki je dodaten v tem skriptu, je še en zunanji stavek IF, kot sledi:če je $ # -eq 2. Če ste prebrali članek o vhodnih parametrih, boste vedeli, da $ # vrne število števila vhodnih parametrov. -Eq pomeni enakost. Izjava IF tako preveri, ali je uporabnik vnesel 2 parametra in če ne, se zgodi, ne da bi delal ničesar. (Ni posebej prijazna).
Zavedam se, da je ta vadnica precej velika. Ta teden ni veliko več, toda hočem pomagati urediti scenarij, preden končamo.
Zadnji pogoj, ki ga morate preučiti o pogojnih izjavah, je izjava CASE.
#! / bin / bash
če je $ # -eq 2potem primer 2 USD aboutdotcom) primeru $ 1 v vse) 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 ;; naslov) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) primeru $ 1 v vse) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; opis) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; naslov) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Izkaz primera je lepši način pisanja, če je ELSE, ČE JE BILO ČE, ČE JE. Na primer ta logika IF sadje = bananeTHEN toELSE IF sadje = pomarančeTHEN toČe je sadje = grozdjeTHEN toEND IF se lahko pišejo kot: primer sadja v banane) To storite ;; pomaranče) To storite ;; grozdje) To storite ;;esac V bistvu prva stvar po zadevi je stvar, ki jo boste primerjali (tj. Sadje). Potem je vsak predmet pred oklepaji stvar, ki jo primerjate in če se ujema z vrsticami pred ;; bo potekal. Izjava o primeru se zaključi z obratnim naslovom (kar je primer nazaj). V rssget.sh skriptu izjava primera odstrani nekaj tega groznega gnezdenja, čeprav ga res ne izboljša dovolj. Za resnično izboljšanje scenarija moram vam predstaviti spremenljivke. Oglejte si naslednjo kodo: #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"prikaz = ""url = "" če je $ # -lt 2 || $ # -gt2potem echo ": rssget.sh vse | opis | naslov odotcom | lxer"; izstop;fi primeru $ 1 v vse) display = "- d -l -u" ;; opis) display = "- d -u" ;; naslov) prikaz = "- u" ;;esac primer 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ prikaži $ url; Spremenljivka je definirana tako, da ji dodeli ime in ji dodeli vrednost. V zgornjem primeru so naslednje naloge spremenljivk: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"prikaz = ""url = "" Skript je takoj obvladljiv z uporabo spremenljivk. Na primer vsak parameter se obravnava ločeno in zato ni ugnezdenih stavkov IF. Spremenljivka zaslona je sedaj nastavljena glede na to, ali ste izbrali vse, opis ali naslov in spremenljivko url nastavite na vrednost spremenljivke aboutdotcom ali vrednost spremenljivke lxer glede na to, ali ste izbrali aboutdotcom ali lxer. Ukaz rsstail mora sedaj samo pravilno uporabiti vrednost prikaza in URL-ja. Čeprav so spremenljivke nastavljene samo tako, da jim dajo ime, da jih dejansko uporabite, morate pred njimi postaviti znak $. Z drugimi besedami, spremenljivka = vrednost nastavi spremenljivko na vrednost, medtem ko $ spremenljivka pomeni, da mi vsebujejo vsebino spremenljivke. Sledi končni skript za to vadnico. #! / 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"uporaba = "uporaba: rssget.sh vse | opis | naslov lxer | odotcom | everydaylinuxuser | linuxtoday"prikaz = ""url = "" če je $ # -lt 2 || $ # -gt2potem echo $ uporaba; izstop;fi primeru $ 1 v vse) display = "- d -l -u" ;; opis) display = "- d -u" ;; naslov) prikaz = "- u" ;; *) echo $ uporaba; izstop; ;;esac primer 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ uporaba; izstop;esac rsstail $ prikaži $ url; Zgornji scenarij uvaja več virov RSS in obstaja spremenljivka uporabe, ki uporabniku pove uporabniku, kako uporabiti skript, če ne vnesejo 2 spremenljivk ali vnašajo napačne možnosti za spremenljivke. To je bil epski članek in morda je prišel predaleč prezgodaj. V naslednjem vodniku vam bom pokazal vse primerjalne možnosti za stavke IF in še veliko več o pogovorih o spremenljivkah. Obstaja tudi več, kar lahko naredimo za izboljšanje zgornjega scenarija in to bo vključeno v prihodnjih vodnikih, ko bomo raziskovali zank, grep in regularne izraze. Oglejte si razdelek Kako (pomaknite se navzdol po kategorijah in si oglejte seznam člankov) razdelka linux.about.com in poiščite več uporabnih vodnikov z dvojnim zagonom sistema Windows in Ubuntu, da nastavite navidezni računalnik z uporabo polj GNOME. Povzetek