Vodič za početnike BASH - uvjeti i varijable

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:

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 / bash
rsstail -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 s linijama između tada i fi ran.

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 nalazi se na retku 4 i uvodi drugu izjavu. 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. Gornji scenarij uvodi elif koji je kratki način da se kaže ELSE IF.

Sada skripta radi kako slijedi. Ako pokrenete sh rssget.sh, dobivate opise, veze i naslove. Ako umjesto toga samo pokrenete sh rssget.sh opis samo ćete dobiti naslova i opisa. 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;
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

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

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. Dakle, linija ako [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] provjerava je li drugi parametar jednak "aboutdotcom" ili "lxer". Ako nije onda IF izjava je dovršena jer nema drugih izjava za vanjsku većinu IF.

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

Sada, ako korisnik pokrene sh rssget.sh krumpir, niš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 2]
zatim

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

Jedini bit koji je dodatni u toj skripti je još jedna vanjska IF izjava kako slijedi: ako [$ # - eq 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 2]
zatim
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
;;
ESAC
fi

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

Na primjer, ova logika

Ako voće = banane
TAKO ovo
DALEKU li voće = naranče
TAKO ovo
DALEKU li voće = grožđe
TAKO ovo
ZAVRŠ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 ono što ć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 2]
zatim
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;
;;
ESAC
rsstail $ 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 2]
zatim
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) l inux.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 .