Vodič za početnike BASH - Uslovi i promenljive

Uvod

Dobrodošli u treći dio "Vodič za početnike BASH". Ako ste propustili prethodna dva članka, verovatno ćete želeti znati šta čini ovaj vodič drugačiji od drugih BASH skriptnih vodiča.

Ovaj vodič piše kompletan novinar BASH-u, i kao čitatelj koji naučite dok naučim. Iako sam početnik BASH-a, dolazim iz osnove razvoja softvera, iako je većina stvari koje sam napisao za Windows platformu.

Prve dve vodiče možete videti tako što ćete posetiti:

Ako ste novi BASH skripti, preporučujem da pročitate prva dva vodiča pre nego što nastavite sa ovim.

U ovom vodiču ću naglasiti kako koristiti uslovne izjave za testiranje korisničkog unosa i kontrolu načina funkcionisanja skripte.

Instaliraj rsstail

Da biste pratili ovaj vodič, potrebno je da instalirate aplikaciju komandne linije zvane rsstail koja se koristi za čitanje RSS feedova .

Ako koristite Debian / Ubuntu / Mint tipa distribucije sledeće:

sudo apt-get install rsstail

Za Fedora / CentOS itd. Ukucajte sledeće:

yum instalirati rststail

Za openSUSE otkucajte sledeće:

zypper instalirati rststail

IF izjava

Otvorite terminal i kreirajte datoteku pod nazivom rssget.sh tako što ćete uneti sledeće:

sudo nano rssget.sh

Unutar nano urednika unesite sledeći tekst:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Sačuvajte datoteku pritiskom na CTRL i O, a zatim izađite pritiskom na CTRL i X.

Pokrenite skriptu tako što ćete uneti sledeće:

sh rssget.sh

Skripta će vratiti listu naslova iz linux.about.com RSS feeda.

To nije preterano korisna skripta, jer ona jednostavno preuzima naslove iz jednog RSS feed-a, ali to uštede na putanju do Linux.about.com RSS feed-a.

Otvorite ponovo rssget.sh skriptu u nano-u i uredite datoteku kako biste izgledali na sledeći način:

#! / bin / bash

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

Ponovo pokrenite skriptu upisivanjem sledećeg:

sh rssget.sh verbose

Ovog puta RSS feed se vraća sa naslovom, linkom i opisom.

Hajde da analiziramo scenario detaljno:

#! / Bin / bash se pojavljuje u svakom scenariju koju pišemo. Sledeća linija u osnovi gleda na prvi ulazni parametar koji korisnik pruža i upoređuje ga sa rečima "verbose". Ako ulazni parametar i reč "verbose" odgovaraju linijama između tada i fi .

Navedeni scenario je očigledno manjak. Šta se događa ako uopšte ne pružite ulazni parametar? Odgovor je da dobijete grešku u redovima neočekivanih operatora.

Druga velika greška je u tome što ako ne navedete riječ "verbose", onda se ništa ne događa. Idealno ako ne navedete reč verbose, skripta će vratiti listu naslova.

Ponovo koristite nano da biste uredili rssget.sh datoteku i izmenili kôd na sledeći način:

#! / bin / bash

ako je [$ 1 = "verbose"]
onda
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

Sačuvajte datoteku i pokrenite je tako što ćete uneti sledeće:

sh rssget.sh verbose

Pojaviće se lista naslova, opisi i veza. Sada ponovo pokrenite na sledeći način:

sh rssget.sh naslova

Ovaj put se pojavljuje samo lista naslova.

Dodatni dio skripte je na liniji 4 i predstavlja drugi izraz. U osnovi skripta sada kaže da li je prvi parametar riječ "verbose" dobiti opis, veze i naslove za RSS feed, ali ako je prvi parametar nešto drugo, samo dobijete listu naslova.

Skripta se malo poboljšala, ali je i dalje pogrešna. Ako ne unesete parametar, i dalje ćete dobiti grešku. Čak i ako pružite parametar, samo rekavši da ne želite da verbose ne znači da želite samo naslove. Možda ste upravo napisali verbose naroiito ili ste ukucali golubove, što je naravno beznačajno.

Pre nego što pokušamo da razjasnimo ove probleme, želim vam pokazati još jednu naredbu koja ide sa IF izrazom.

Izmjenite rssget.sh skriptu kako biste izgledali sljedeće:

#! / bin / bash

ako [$ 1 = "svi"]
onda
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "opis"]
onda
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 da se riješim riječi i zamijenim sa svim. To nije bitan deo. Gornji scenario uvodi elif koji je kratak način da kaže ELSE IF.

Sada scenario radi na sledeći način. Ako pokrenete sh rssget.sh sve tada dobijate opise, linkove i naslove. Ako umesto toga pokrenete sh rssget.sh opis , dobićete samo naslove i opise. Ako dostavite bilo koju drugu riječ, dobićete listu naslova.

Ovo uvodi način brzo dolazeći sa spiskom uslovnih izjava. Alternativni način korištenja ELIF-a je korištenje onoga što je poznato kao ugnežene izjave IF-a.

Sledeći je primer koji pokazuje kako funkcionišu ugrađeni izrazi IF:

#! / bin / bash

ako [$ 2 = "aboutdotcom"]
onda
ako [$ 1 = "svi"]
onda
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "opis"]
onda
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 = "svi"]
onda
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "opis"]
onda
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 ukucajte sve to ako želite ili kopirajte i zalepite je u vašu datoteku rssget.sh.

Gornja skripta predstavlja drugi parametar koji vam omogućava da izaberete ili "about.com" ili "lxer.com" RSS feed.

Da biste je pokrenuli, unosite sledeće:

sh rssget.sh sve odotcom

ili

sh rssget.sh sve lxer

Naravno, možete sve zameniti sa opisima ili naslovima da biste dobili samo opise ili samo naslove.

U suštini gornji kod kaže da ako je drugi parametar okodotcom onda pogledajte drugu ako je izjava koja je ista iz prethodnog skripta drugu ako je drugi parametar lxer zatim potražite unutrašnju reč ako ponovo odlučite da li želite prikazati naslove, opise ili sve.

Ta skripta je predstavljena isključivo kao primer ugnježđene IF izjave i ima toliko pogrešnih problema sa tim skriptom, za koji bi trebalo da se objasni drugi članak. Glavno pitanje je da to nije skalabilno.

Zamislite da želite da dodate još jedan RSS feed kao što su Svakodnevni Linux Korisnik ili Linux danas? Scenarij bi postao ogroman i ako ste odlučili da želite da se unutrašnja IF izjava promijeni, vi biste morali da je promenite na više mesta.

Iako postoji neko vreme i mesto za gnezdo, ako ih treba upotrebljavati pošteno. Obično postoji način za refactor vaš kod, tako da vam uopšte nije potreban gnezdeni IF. Doći ću na ovu temu u budućem članku.

Hajde sada pogledati ispravljanje problema ljudi koji ulaze u parametre duff. Na primjer, u gore navedenom skriptu ako korisnik unese nešto drugo osim "aboutdotcom" kao 2. parametar onda se lista članaka pojavi iz RSS feed-a iz LXER-a, bez obzira da li korisnik unese lxer ili ne.

Pored toga, ako korisnik ne unese "sve" ili "opis" kao prvi parametar onda je podrazumevana lista naslova koji može ili ne biti ono što je korisnik namjeravao.

Pogledajte sledeću skriptu (ili kopirajte i zalepite je u vašu datoteku rssget.sh.

#! / bin / bash

ako [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
onda
ako [$ 1 = "svi"] || [$ 1 = "opis"] || [$ 1 = "naslov"]
onda
ako [$ 2 = "aboutdotcom"]
onda

ako [$ 1 = "svi"]
onda
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "opis"]
onda
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 = "svi"]
onda
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "opis"]
onda
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 primetiti je da se scenario sada postaje prilično velik i da brzo možete da vidite kako se iz ugla kontrole može uočiti izjave.

Bit koji je važan u ovoj skripti je IF izjava || izjava THEN sekcija na liniji 2 i red 4.

The || označava OR. Dakle, linija ako [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] proverava da li je drugi parametar jednak "aboutdotcom" ili "lxer". Ako nije tada, IF izjava je potpuna, jer ne postoji drugi izraz za vanjsko većinu IF.

Slično na liniji 4 linija ako [$ 1 = "svi"] || [$ 1 = "opis"] || [$ 1 = "title"] proverava da li je prvi parametar jednak ili "sve" ili "opis" ili "naslov".

Sada ako korisnik pokreće sh rssget.sh krompir sira, ništa se ne vraća, pre nego što bi dobili listu naslova iz LXER-a.

Nasuprot || je &&. Operator && označava AND.

Ja ću učiniti da scenarij izgleda više kao noćna mora, ali to čini sve važne provere kako bi se osiguralo da korisnik obezbedi 2 parametra.

#! / bin / bash

ako [$ # -eq 2]
onda

ako [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
onda
ako [$ 1 = "svi"] || [$ 1 = "opis"] || [$ 1 = "naslov"]
onda
ako [$ 2 = "aboutdotcom"]
onda

ako [$ 1 = "svi"]
onda
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "opis"]
onda
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 = "svi"]
onda
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "opis"]
onda
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 ekstra u tom skriptu je još jedna spoljna IF izjava na sledeći način: ako [$ # -eq 2] . Ako pročitate članak o ulaznim parametrima, znaćete da $ # vraća broj od broja ulaznih parametara. -eq označava jednake. Izjava IF-a stoga provjerava da li je korisnik uneo 2 parametra i ako nisu uspeli da izađu bez učinka bilo čega. (Nije posebno prijateljski).

Svestan sam da je ovaj tutorijal prilično velik. Ove sedmice nema mnogo toga da pokrijem, ali hoću da pomognem da uredim scenario pre nego što završimo.

Poslednja komanda koju morate naučiti o uslovnim izjavama je izjava CASE.

#! / bin / bash


ako [$ # -eq 2]
onda
slučaj $ 2 in
aboutdotcom)
slučaj $ 1 in
sve)
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)
slučaj $ 1 in
sve)
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

Izjava o slučaju je lepši način pisanja IF ELSE IF ELSE IF ELSE IF.

Na primjer ova logika

IF fruit = banane
Tada ovo
ELSE IF fruit = pomorandže
Tada ovo
ELSE IF fruit = grožđe
Tada ovo
END IF

može se prepisati kao:

slučaj voće u
banane)
uradi ovo
;;
narandže)
uradi ovo
;;
grožđe)
uradi ovo
;;
esac

U suštini prva stvar posle slučaja je ono što ćete upoređivati ​​(tj. Voće). Tada je svaka stavka prije zagrada ono što upoređujete i ako se to poklapa sa linijama koje prethodi ;; će se pokrenuti. Izjava o slučajevima prekida se obrnutim esacom (što je slučaj unazad).

U rssget.sh skripti izjava slučaja uklanja neke od tih groznih gneženja, iako ih stvarno ne poboljšava dovoljno.

Za stvarno poboljšanje skripte moram vam predstaviti varijable.

Pogledajte sledeći kod:

#! / bin / bash

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

ako [$ # -lt 2] || [$ # -gt 2]
onda
echo "upotreba: rssget.sh [all | description | title] [aboutdotcom | lxer]";
Izlaz;
fi

slučaj $ 1 in
sve)
display = "- d -l -u"
;;
opis)
display = "- d -u"
;;
naslov)
display = "- u"
;;
esac

slučaj $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ prikaži $ url;

Varijabla se definiše davanjem imena i dodeljivanja vrijednosti. U gore navedenom primeru sledeće su varijable zadaci:

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

Skripta se odmah može upravljati pomoću varijabli. Na primjer, svaki parametar se obrađuje odvojeno, tako da nema gneženih izjava IF.

Sada je postavljena varijabilna varijabla u zavisnosti od toga da li ste izabrali sve, opis ili naslov, a varijabla url-a je postavljena na vrijednost aboutdotcom varijable ili vrijednost lxer varijable u zavisnosti od toga da li ste izabrali aboutdotcom ili lxer.

Komanda rsstail sada mora da koristi vrednost ekrana i url-a da radi ispravno.

Iako se promenljive postavljaju samo im daju ime, da ih zapravo koriste, morate postaviti znak $ pred njima. Drugim riječima varijabla = vrijednost postavlja varijablu na vrijednost dok $ varijabla znači dati mi sadržaj varijable.

Sledeći tekst je završni scenario za ovaj tutorijal.

#! / 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/linuxxtoday/linux"
usage = "upotreba: rssget.sh [all | description | title] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
display = ""
url = ""

ako [$ # -lt 2] || [$ # -gt 2]
onda
echo $ upotreba;
Izlaz;
fi

slučaj $ 1 in
sve)
display = "- d -l -u"
;;
opis)
display = "- d -u"
;;
naslov)
display = "- u"
;;
*)
echo $ upotreba;
Izlaz;
;;
esac

slučaj $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ upotreba;
Izlaz;
esac

rsstail $ prikaži $ url;

Navedeni skript uvodi više RSS feedova i postoji varijabla koja korisnicima govori kako da koriste skriptu ako ne unesu 2 varijable ili unesu netačne opcije za varijable.

Sažetak

Ovo je epski članak i možda je prerano prešao. U sledećem vodiču ću vam pokazati sve opcije poređenja za IF izjave i još mnogo toga o kojima ću pričati s obzirom na varijable.

Postoji i više toga što se može učiniti kako bi se poboljšao gornji scenario i to će biti obuhvaćeno u budućim vodičima dok istražujemo petlje, grep i regularne izraze.

Pogledajte odeljak How To (skrolujte pored kategorija za prikaz liste članaka) odeljaka l inux.about.com da biste pronašli više korisnih vodiča iz dualnog pokretanja Windowsa i Ubuntua za postavljanje virtualne mašine pomoću GNOME polja .