Skip to main content

Vodič za početnike - uvjeti i varijable

Supersection 1, More Comfortable (Travanj 2025)

Supersection 1, More Comfortable (Travanj 2025)
Anonim

Uvod

Dobro došli u treći dio "Vodiča za početnike BASH". Ako ste propustili prethodna dva članka, vjerojatno ćete htjeti znati što vodi ovaj vodič drukčijim drugim BASH skriptnim vodičima.

Ovaj vodič napisao je potpuni novak BASH-u i kao čitatelj kojeg naučite dok naučim. Iako sam početnik BASH-a, dolazim iz pozadine za razvoj softvera, iako je većina stvari koje sam napisao bila za Windows platformu.

Prva dva vodiča možete vidjeti tako da posjetite:

  • Vodič za početnike za BASH - Hello World
  • Vodič za početnike BASH - Parametri unosa

Ako ste novi u ABB skriptiranju, preporučujem da pročitate prve dvije vodiče prije nego što nastavite s ovim.

U ovom vodiču naglašavam kako koristiti uvjetne izjave za testiranje korisničkog unosa i kontrolu funkcioniranja skripte.

Instalirajte rsstail

Da biste slijedili ovaj vodič, morat ćete instalirati naredbeni redak koji se zove rsstail koji se koristi za čitanje RSS feedova.

Ako koristite Debian / Ubuntu / Mint na temelju distribucije sljedeće:

sudo apt-get instaliraj rsstail

Za Fedora / CentOS itd. Upišite sljedeće:

yum instaliraj rsstail

Za openSUSE unesite sljedeće:

zypper instalirajte rsstail

IF izjava

Otvorite terminal i stvorite datoteku koja se zove rssget.sh upisivanjem sljedećeg:

sudo nano rssget.sh

Unutar nano editor unesite sljedeći tekst:

#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Spremite datoteku pritiskom na tipke CTRL i O, a zatim izađite pritiskom tipke CTRL i X.

Pokrenite skriptu upisivanjem sljedećeg:

sh rssget.sh

Skripta će vratiti popis naslova iz linux.about.com RSS feed.

To nije pretjerano korisna skripta jer samo pronalazi naslove iz jednog RSS feeda, ali ne sprema zapamtiti put do Linux.about.com RSS feed.

Ponovno otvorite rssget.sh skriptu u nano i uredite datoteku da izgleda kako slijedi:

#! / Bin / bash

ako $ 1 = "verbose"zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi

Ponovno pokrenite skriptu upisivanjem sljedećeg:

sh rssget.sh verbose

Ovaj put RSS feed se vraća naslovom, vezom i opisom.

Let's analizirajte skriptu u malo detalja:

#! / Bin / bash pojavljuje se u svakoj skripti koju pišemo. Sljedeća crta u osnovi gleda na prvi ulazni parametar koji korisnik daje i uspoređuje ga s riječju "opširno". Ako se ulazni parametar i riječ "verbose" podudaraju između linija zatim i fi su pokrenuti.

Gornja skripta očito je manjkava. Što se događa ako uopće ne unesete ulazni parametar? Odgovor je da dobivate pogrešku duž redova neočekivanog operatera.

Drugi glavni nedostatak je da, ako ne doznate riječ "verbalno" onda se ništa uopće ne događa. U idealnom slučaju, ako ne navedete riječ glagoljicom, skripta će vratiti popis naslova.

Ponovno upotrijebite nano da biste uredili datoteku rssget.sh i izmijenili kôd na sljedeći način:

#! / Bin / bash

ako $ 1 = "verbose"zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi

Spremite datoteku i pokrenite ga unosom sljedećeg:

sh rssget.sh verbose

Pojavit će se popis naslova, opisa i veza. Sada ga ponovno pokrenite na sljedeći način:

sh rssget.sh naslova

Ovaj put se pojavljuje samo popis naslova.

Dodatni dio skripte je na liniji 4 i uvodi drugo izjava. U osnovi, skripta sada govori da li je prvi parametar riječ "opširno" dobiti opis, veze i naslove za RSS feed, ali ako je prvi parametar bilo što drugo samo bi dobili popis naslova.

Skripta se blago poboljšala, ali je i dalje pogrešna. Ako ne unesete parametar, i dalje ćete dobiti pogrešku. Čak i ako dajete parametar, samo kažete da ne želite da riječ ne znači da želite samo naslove. Možda ste upravo napisali netočno pogrešno ili ste možda upisali golubove koji su, naravno, besmisleni.

Prije nego što pokušamo razjasniti te probleme, želim vam pokazati još jednu naredbu koja ide uz IF izjavu.

Uredite rssget.sh skriptu kako biste izgledali kako slijedi:

#! / Bin / bash

ako $ 1 = "sve"zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "opis"zatim rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi

Odlučio sam se riješiti riječi oprezan i zamijenio ga sa svima. To nije važan dio. Gornja skripta uvodi Elif što je kratak način da se kaže ELSE IF.

Sada skripta radi kako slijedi. Ako pokrenete sh rssget.sh sve onda dobivate opise, veze i naslove. Ako umjesto toga samo trčiš sh opis rssget.shdobit ćete samo naslove i opise. Ako dostavite bilo koju drugu riječ, dobit ćete popis naslova.

To uvodi način brzog dolaska gore sa popisom uvjetnih izjava. Alternativni način rada ELIF-a je korištenje onoga što je poznato kao ugniježđene IF izjave.

Slijedi primjer koji pokazuje kako ugrađene IF izjave funkcioniraju:

#! / Bin / bash

ako $ 2 = "aboutdotcom"zatim ako $ 1 = "sve" zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" zatim rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fidrugo ako $ 1 = "sve" zatim rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" zatim rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi

Slobodno unesite sve to ako želite ili kopirajte i zalijepite ga u rssget.sh datoteku.

Gornja skripta uvodi drugi parametar koji vam omogućuje da odaberete "about.com" ili "lxer.com" i RSS feed.

Da biste ga pokrenuli, upišite sljedeće:

sh rssget.sh sve aboutdotcom

ili

sh rssget.sh sve lxer

Naravno, možete zamijeniti sve s opisima ili naslovima kako biste dobili samo opise ili samo naslove.

Uglavnom gore navedeni kod kaže ako je drugi parametar aboutdotcom onda pogledajte drugu if izjavu koja je ista iz prethodne skripte, ako je drugi parametar lxer onda pogledajte unutarnju rečenicu ako ponovno odlučite želite li prikazati naslove, opise ili sve.

Ta skripta pruža se isključivo kao primjer ugniježđene IF izjave i ima toliko mnogo toga pogrešno u tom skriptu da bi trebalo još jedan članak da ih sve objasni. Glavno je pitanje da nije skalabilno.

Zamislite da želite dodati još jedan RSS feed kao što je svakodnevni Linux korisnik ili Linux danas? Skripta bi postala ogromna i ako ste odlučili da želite promijeniti unutarnju IF poruku, morat ćete ga promijeniti na više mjesta.

Iako postoji vrijeme i mjesto za ugniježđenu IF, trebalo bi ih koristiti rijetko. Obično postoji način da se ponovno uredite kod, tako da vam uopće ne trebate ugniježđeni IF. Ja ću se upoznati s ovom temom u budućem članku.

Pogledajmo sada popravljajući pitanje ljudi koji ulaze u duff parametre. Na primjer u gore navedenoj skripti ako korisnik unese nešto drugo osim "aboutdotcom" kao drugi parametar, onda se popis članaka pojavljuje iz RSS feeda LXER-a bez obzira na to da li korisnik unese lxer ili ne.

Osim toga, ako korisnik ne unese "sve" ili "opis" kao prvi parametar onda je zadani popis naslova koji mogu biti ili ne biti ono što je korisnik namjeravao.

Pogledajte sljedeću skriptu (ili ga kopirajte i zalijepite u rssget.sh datoteku.

#! / Bin / bash

ako $ 2 = "aboutdotcom" || $ 2 = "lxer"zatim ako $ 1 = "all" || $ 1 = "opis" || $ 1 = "naslov" zatim ako $ 2 = "aboutdotcom" zatim ako $ 1 = "sve" zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" zatim rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi drugo ako $ 1 = "sve" zatim rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" zatim rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi

Prva stvar koju treba imati na umu je da je skripta sada dobivanje prilično velika i možete brzo vidjeti kako izvan kontrole ugniježđene IF izjave mogu postati.

Bit koji je važan u ovoj skripti je IF izjava || izjava THEN dio na crti 2 i crta 4.

| | označava OR. Znači linijuako $ 2 = "aboutdotcom" || $ 2 = "lxer"provjerava je li drugi parametar jednak "aboutdotcom" ili "lxer". Ako nije onda IF izjava je dovršena jer nema drugo izjavu za vanjsku većinu AKO.

Slično na crti 4 linija ako $ 1 = "all" || $ 1 = "opis" || $ 1 = "naslov"provjerava je li prvi parametar jednak "bilo" ili "opis" ili "naslov".

Sada, ako korisnik radish rssget.sh krumpir siraništa se ne vraća, a prije nego što bi dobili popis titula iz LXER-a.

Suprotno od | | je &&. && operator označava AND.

Ja ću napraviti skriptu izgledati još više kao noćna mora, ali čini sve važne provjere kako bi bili sigurni korisnik je dao 2 parametara.

#! / Bin / bash

ako $ # - eg 2zatim

ako $ 2 = "aboutdotcom" || $ 2 = "lxer" zatim ako $ 1 = "all" || $ 1 = "opis" || $ 1 = "naslov" zatim ako $ 2 = "aboutdotcom" zatim ako $ 1 = "sve" zatim rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "opis" zatim rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi drugo ako $ 1 = "sve" zatim rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "opis" zatim rsstail -d -u http://lxer.com/module/newswire/headlines.rss drugo rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi

Jedini bit koji je dodatni u toj skripti je još jedna vanjska IF izjava kako slijedi:ako $ # - eg 2, Ako ste pročitali članak o parametrima unosa, znat ćete da $ # vraća broj broja ulaznih parametara. "Eq" znači jednako. IF izjava stoga provjerava je li korisnik ušao u 2 parametra i ako to nije izlazio bez da radi ništa. (Nije osobito prijateljski).

Svjestan sam da ovaj vodič postaje prilično velik. Ne postoji mnogo više za pokrivanje ovog tjedna, ali želim pomoći urediti skriptu prije nego što završimo.

Jedina zadnja naredba koju trebate saznati o uvjetnim izjavama jest izjava CASE.

#! / Bin / bash

ako $ # - eg 2zatim slučaj $ 2 u aboutdotcom) slučaj $ 1 u svi) 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 ;; titula) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; ESAC ;; lxer) slučaj $ 1 u svi) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; opis) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titula) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; ESAC ;; ESACfi

Izjava slučaja je ljepši način pisanja, AKO JE, AKO JE, AKO JE, AKO JE.

Na primjer, ova logika

Ako voće = bananeTAKO ovoDALEKU li voće = narančeTAKO ovoDALEKU li voće = grožđeTAKO ovoZAVRŠI AKO

mogu se prepisati kao:

rast voća u banane) napravi to ;; naranče) napravi to ;; grožđe) napravi to ;;ESAC

U osnovi prva stavka nakon slučaja je stvar koju ćete usporediti (npr. Voće). Zatim je svaka stavka prije zagrada stvar koju uspoređujete i ako odgovara linijama koje su prethodile ;; će biti ran. Izjava o slučaju je prekinuta obrnutim ESAC (što je slučaj unatrag).

U rssget.sh skripti izjava o slučaju uklanja neke od onog strašnog gniježđenja, iako ga zapravo ne popravlja dovoljno.

Da biste stvarno poboljšali skriptu, moram vas upoznati s varijablama.

Pogledajte sljedeći kod:

#! / Bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"Zaslon = „”url = ""

ako $ # -lt 2 || $ # - gt 2zatim echo "upotreba: rssget.sh sve | opis | naslov aboutdotcom | lxer"; Izlaz;fi

slučaj $ 1 u svi) display = "- d -l -u" ;; opis) display = "- d -u" ;; titula) Prikaz = "- u" ;;ESAC

slučaj $ 2 u aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;ESACrsstail $ display $ url;

Varijabla se definira dajući mu ime i dodijeliti joj vrijednost. U gore navedenom primjeru sljedeći su dodjeljivanje varijabli:

lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"Zaslon = „”url = ""

Skripta se odmah može upravljati pomoću varijabli. Na primjer, svaki parametar se obrađuje odvojeno i tako ne postoje ugniježđene IF izjave.

Varijabla prikaza sada je podešena ovisno o tome ste odabrali sve, opis ili naslov, a varijabla url postavljena je na vrijednost varijable aboutdotcom ili vrijednosti varijable lxer ovisno o odabiru aboutdotcom ili lxer.

Rsstail naredba sada mora samo koristiti vrijednost prikaza i url za pravilno funkcioniranje.

Dok su varijable postavljene samo dajući im ime, da biste ih zapravo upotrijebili, morate ispred njih staviti $ znak. Drugim riječima, varijabla = vrijednost postavlja varijablu na vrijednost, dok $ varijabla znači da dajem sadržaj varijable.

Ovo je posljednja skripta za ovaj vodič.

#! / 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"use = "korištenje: rssget.sh sve | opis | naslov lxer | aboutdotcom | everydaylinuxuser | linuxtoday"Zaslon = „”url = ""

ako $ # -lt 2 || $ # - gt 2zatim echo $ usage; Izlaz;fi

slučaj $ 1 u svi) display = "- d -l -u" ;; opis) display = "- d -u" ;; titula) Prikaz = "- u" ;; *) echo $ usage; Izlaz; ;;ESAC

slučaj $ 2 u aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; Izlaz;ESAC

rsstail $ display $ url;

Gornja skripta uvodi više RSS feedova i postoji varijabla upotrebe koja korisnicima upućuje na upotrebu skripte ako ne upisuju 2 varijable ili unesu pogrešne opcije za varijable.

Sažetak

Ovo je bio epski članak i možda je previše prerano prešutio. U sljedećem vodiču prikazat ću vam sve mogućnosti usporedbe za IF izjave i još uvijek postoji mnogo više za razgovor o varijablama.

Postoji još više toga što se može učiniti kako bismo poboljšali gore navedenu skriptu i to će biti pokrivene u budućim vodičima dok istražujemo petlje, grepove i regularne izraze.

Pogledajte odjeljak Kako se (kretanje prema dolje pokraj kategorija da biste vidjeli popis članaka) odjeljak linux.about.com da biste pronašli više korisnih vodiča s dvostrukim dizanjem sustava Windows i Ubuntu za postavljanje virtualnog računala pomoću GNOME okvira.