Začetni vodnik BASH - pogoji in spremenljivke

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:

Č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 / bash
rsstail -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 se vhodni parameter in beseda "verbose" ujemata z vrsticami med takrat in fi .

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 skripta je v vrstici 4 in uvaja izjavo drugega . 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. Zgornji scenarij uvaja elif, ki je kratek način reči ELSE IF.

Zdaj scenarij deluje na naslednji način. Če zaženete sh rssget.sh vse, potem dobite opise, povezave in naslove. Če namesto tega preprosto zaženete sh rssget.sh opis , boste 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;
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

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
fi
fi

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 [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] preveri, ali je 2. parameter enak "aboutdotcom" ali "lxer". Če ni, potem je IF izjava dokončana, ker za zunanjo večino ni nobene izjave .

Podobno na vrstici 4 črta, če [$ 1 = "vsi"] || [$ 1 = "opis"] || [$ 1 = "title"] preveri, ali je prvi parameter enak "vsem" ali "opisom" ali "naslovom".

Zdaj, če uporabnik izvaja sh rssget.sh sira krompirja, se nič ne vrne, preden bi prejeli seznam naslovov iz LXER-a.

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 2]
potem

č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
fi
fi

Edini bit, ki je dodaten v tem skriptu, je še en zunanji stavek IF, kot sledi: če [$ # -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 2]
potem
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
;;
esac
fi

Izkaz primera je lepši način pisanja, če je ELSE, ČE JE BILO ČE, ČE JE.

Na primer ta logika

IF sadje = banane
THEN to
ELSE IF sadje = pomaranče
THEN to
Če je sadje = grozdje
THEN to
END IF

se lahko pišejo kot:

primer sadja v
banane)
To storite
;;
pomaranče)
To storite
;;
grozdje)
To storite
;;
esac

V bistvu je prva stvar po zadevi 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] || [$ # -gt2]
potem
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;
;;
esac
rsstail $ 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] || [$ # -gt2]
potem
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.

Povzetek

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) v razdelku l inux.about.com, če želite poiskati uporabnejše vodnike z dvojnim zagonom sistema Windows in Ubuntu, da nastavite navidezni računalnik z uporabo polj GNOME .