Algajad Juhend BASH-ile - Tingimused ja Muutujad

Sissejuhatus

Tere tulemast BASH algajate juhendi kolmandasse ossa. Kui olete kahe eelmise artikli vahele jäetud, siis tõenäoliselt soovite teada, mis muudab selle juhendi teiste BASH-i skriptijuhistega.

Seda juhendit kirjutas täispikk algaja BASHile ja nii nagu lugeja, kellega õpid õpinguid. Kuigi ma olen BASHi algaja, olen pärit tarkvaraarenduse taustast, kuigi enamik asju, mida olen kirjutanud, on olnud Windowsi platvormil.

Esimesed kaks juhendit saate vaadata, külastades järgmist:

Kui sa oled BASH-i skriptidest uus, soovitan enne nendega jätkamist lugeda kahte esimest juhendit.

Selles juhendis tuuakse esile, kuidas kasutada tingimuslikke avaldusi kasutaja sisendite testimiseks ja skripti toimimise kontrollimiseks.

Installige rsstail

Selle juhendi järgimiseks peate installima käsurea rakenduse nimega rsstail, mida kasutatakse RSS-voogude lugemiseks.

Kui kasutate Debiani / Ubuntu / rahapaberi baasjaotuse tüüpi, kasutage järgmist.

sudo apt-get install rsstail

Fedora / CentOS jne jaoks kirjuta järgmine:

yum install rsstail

Sisesta openSUSE tüüpi järgmiselt:

zypper install rsstail

IF avaldus

Avage terminal ja looge fail nimega rssget.sh, sisestage järgmine:

sudo nano rssget.sh

Nano redaktoris sisestage järgmine tekst:

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

Salvestage fail vajutades CTRL ja O ning seejärel vajutage CTRL ja X vajutades.

Käivitage skript, kirjutades järgmiselt:

sh rssget.sh

Skript saadab nimekirja nimesid linux.about.com RSS-voogu.

See ei ole liiga kasulik skript, sest see lihtsalt tagab pealkirjad ühelt RSS -lt, kuid see salvestab vajaduse meeles pidada Linux.about.com RSS-i kanali teed.

Avage rssget.sh skript nano-s uuesti ja muutke fail järgmiselt:

#! / bin / bash

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

Käivitage skript uuesti, sisestage järgmised andmed:

sh rssget.sh verbose

Seekord tagab RSS-kanal pealkirja, lingi ja kirjelduse.

Lähemalt analüüsime skripti veidi:

#! / Bin / bash ilmub kõigis kirjutatavates skriptides. Järgmine joon vaatleb põhiliselt esimest kasutaja poolt sisestatud parameetrit ja võrdleb seda sõna "verbose". Kui sisendparameeter ja sõna "verbose" sobivad, siis jooned ja fi vahelduvad.

Ülaltoodud skript on ilmselgelt vigane. Mis juhtub, kui te ei anna üldse sisendparameetrit? Vastus on, kui tekib viga ootamatu operaatori joonisel.

Teine oluline viga on see, et kui te ei anna sõna "verbose", siis midagi ei juhtu üldse. Ideaalis, kui te ei anna sõna verbosega, tagastab skript pealkirjade loendi.

Kasuta faili rssget.sh redigeerimiseks nano uuesti ja muutke koodi järgmiselt:

#! / bin / bash

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

Salvestage fail ja käivitage see, sisestage järgmised andmed:

sh rssget.sh verbose

Ilmub pealkirjade, kirjelduste ja linkide loend. Nüüd käivitage see uuesti järgmiselt:

sh rssget.sh pealkirjad

Seekord kuvatakse ainult pealkirjade nimekiri.

Skripti täiendav osa on real 4 ja tutvustab muud avaldust. Põhimõtteliselt ütleb skript, et kui esimene parameeter on sõna "verbose", saad RSS-kanali kirjelduse, lingid ja pealkirjad, kuid kui esimene parameeter on midagi muud, saate lihtsalt pealkirjade loendi.

Skript on veidi paranenud, kuid see on endiselt vigane. Parameetri sisestamata jätmisel ilmneb ikkagi viga. Isegi kui näete parameetrit, öeldes lihtsalt, et te ei soovi verbosega, ei tähenda see, et soovite ainult pealkirju. Võib-olla olete just kirjutanud verbose vale näiteks või olete kirjutanud tuvid, mis on loomulikult mõttetu.

Enne kui me üritame neid küsimusi selgeks teha, tahan näidata teile veel ühte käsku, mis läheb IF-avaldusega.

Muutke oma rssget.sh skripti järgmiselt:

#! / bin / bash

kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Ma otsustasin sõnalt verbist lahti saada ja asendasin sellega kõik. See ei ole oluline osa. Eespool esitatud skript tutvustab elifit, mis on lühike võimalus öelda ELSE IF.

Nüüd toimib skript järgmiselt. Kui käivitate sh rssget.sh, siis saate kirjeldused, lingid ja pealkirjad. Kui selle asemel käivitate lihtsalt sh rssget.sh kirjelduse, saate lihtsalt pealkirjad ja kirjeldused. Kui esitate mõnda muud sõna, saate pealkirjade nimekirja.

See tutvustab viisi, kuidas kiiresti esitada tingimusteta avalduste loend. Alternatiivne viis ELIF-i tegemiseks on kasutada seda, mis on tuntud kui lingitud IF avaldused.

Allpool on toodud näide, kuidas lingitud IF-avaldused toimivad:

#! / bin / bash

kui [$ 2 = "aboutdotcom"]
siis
kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
muidu
kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Soovi korral võite kirjutada kõik need, või kopeerida ja kleepida see oma rssget.sh-faili.

Eespool toodud skript tutvustab 2. parameetrit, mis võimaldab teil valida kas "about.com" või "lxer.com" RSS-voo.

Selle käivitamiseks sisestate järgmised andmed:

sh rssget.sh kõik aboutdotcom

või

sh rssget.sh kõik lxer

Muidugi saate asendada kõik kirjeldustega või pealkirjadega, et pakkuda lihtsalt kirjeldusi või lihtsalt pealkirju.

Põhimõtteliselt ütleb ülaltoodud kood ütleb, kas teine ​​parameeter on about dotcom, siis vaata teist, kui avaldus, mis on sama eelmise skripti puhul, kui teine ​​parameeter on lxer, siis vaata sisemist, kui avaldus jälle otsustab, kas näidata pealkirju, kirjeldusi või kõike.

See skript on esitatud ainult kui pesastatud IF-i avalduse näide ja selle skripti puhul on nii palju asju, et oleks vaja veel ühte artiklit, mis neid kõiki selgitaks. Peamine küsimus on selles, et see ei ole skaleeritav.

Kujutage ette, et soovite lisada veel üht RSS-voogu nagu Everyday Linux User või Linux Today? Skript muutub tohutuks ja kui otsustate, et soovite, et sisemine IF avaldus muutuks, peate selle muutma mitmes kohas.

Kuigi pingutatud IF-i jaoks on aeg ja koht, tuleks neid säästlikult kasutada. Tavaliselt on teie koodi parandamine võimalikult nii, et sulle pole vaja pessa võetud IF-d. Ma tulen selle teema juurde tulevasse artikliksse.

Vaatame nüüd, kuidas määrata kindlaks parameetrite sisestamise küsimused. Näiteks ülaltoodud skripti puhul, kui kasutaja sisestab teise parameetri asemel mõne muu kui "aboutdotcom", ilmub LXER-i RSS-voogist loend artiklid sõltumata sellest, kas kasutaja siseneb lxerile või mitte.

Lisaks sellele, kui kasutaja ei sisesta 1. parameetrisse "kõik" või "kirjeldus", siis on vaikimisi nimekiri pealkirjadest, mis võivad olla või mitte, mida kasutaja soovis.

Vaadake järgmist skripti (või kopeerige see oma rssget.sh-faili.

#! / bin / bash

kui [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
siis
kui [$ 1 = "kõik"] || [$ 1 = "kirjeldus"] || [$ 1 = "pealkiri"]
siis
kui [$ 2 = "aboutdotcom"]
siis

kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
muidu
kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Esimene asi, mida tuleb silmas pidada, on see, et skript muutub üsna suurteks ja saate kiiresti näha, kuidas väljastpoolt kontrollitud postitatud IF-i avaldused muutuvad.

Selles skriptis olev bitis on IF avaldus || teesõna THEN rida 2 ja 4. rida.

|| tähistab OR. Nii joon, kui [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] kontrollib, kas 2. parameeter on võrdne "aboutdotcom" või "lxer". Kui see ei ole siis IF avaldus on lõpetatud, sest ei ole muud avaldust välise kõige IF.

Sarnaselt reas 4 rida, kui [$ 1 = "kõik"] || [$ 1 = "kirjeldus"] || [$ 1 = "title"] kontrollib, kas 1. parameeter on kas "kõik" või "kirjeldus" või "pealkiri".

Nüüd, kui kasutaja käitab sh rssget.sh kartuli juust, ei tagastata midagi, enne kui nad oleksid saanud LXER-i pealkirjade loendi.

Vastupidine || on &&. && operaator tähistab AND.

Ma teen selle, et skript näeks välja veelgi nagu õudusunenägu, kuid see teeb kõik olulised kontrollid, et veenduda, kas kasutaja on esitanud 2 parameetrit.

#! / bin / bash

kui [$ # -eq 2]
siis

kui [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
siis
kui [$ 1 = "kõik"] || [$ 1 = "kirjeldus"] || [$ 1 = "pealkiri"]
siis
kui [$ 2 = "aboutdotcom"]
siis

kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
muidu
kui [$ 1 = "kõik"]
siis
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "kirjeldus"]
siis
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
muidu
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Ainuke bitis, mis selles skriptis lisab, on teine ​​välise IF-i aruanne järgmiselt: kui [$ # -eq 2] . Kui loete artiklit sisendparameetrite kohta, siis teate, et $ # tagastab sisendparameetrite arvu. -eq tähistab võrdset. Seepärast kontrollib IF-i aruanne, et kasutaja sisestas 2 parameetrit ja kui ta ei jõudnud sellele lihtsalt välja, ei tee midagi. (Pole eriti sõbralik).

Olen teadlik, et see juhendaja on üsna suur. Selle nädala katmiseks pole veel palju rohkem, kuid ma tahan aidata skripti korrastada enne, kui me lõpetame.

Viimane käsu, mida peate tingimisi avalduste kohta õppima, on CASE avaldus.

#! / bin / bash


kui [$ # -eq 2]
siis
juhul $ 2 in
aboutdotcom)
juhul $ 1 in
kõik)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
kirjeldus)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
pealkiri)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
juhul $ 1 in
kõik)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
kirjeldus)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
pealkiri)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Juhtumianalüüs on parem kirjutamise viis, KUI ELSE, KUI ELSE, KUI ELSE KUI ELSE.

Näiteks see loogika

Kui puu = banaanid
Siis seda
ELSE IF vilja = apelsinid
Siis seda
ELSE IF vilja = viinamarjad
Siis seda
END IF

saab ümber kirjutada järgmiselt:

juurdekuuluv puu sisse
banaanid)
tee seda
;;
apelsinid)
tee seda
;;
viinamarjad)
tee seda
;;
esac

Põhimõtteliselt on juhtumi esimene asi, mida võrrelda (so puu). Siis iga sulgudes olev toode on see, mida te võrdlete, ja kui see vastab eelnevatele joontele ;; hakkab jooksma. Juhtumiteade lõpetatakse tagasikäigu ESAC-iga (mis on juhtum tagasi).

Skriptis rssget.sh eemaldatakse juhtumianalüüs mõni neist kohutavast pesitsemisest, kuigi see ei toeta seda piisavalt.

Stsenaariumi tõeliseks parandamiseks pean teid muutujaid tutvustama.

Vaadake järgmist koodi:

#! / bin / bash

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

kui [$ # -lt 2] || [$ # -gt 2]
siis
echo "kasutamine: rssget.sh [all | kirjeldus | pealkiri] [aboutdotcom | lxer]";
väljumine;
fi

juhul $ 1 in
kõik)
kuva = "- d -l -u"
;;
kirjeldus)
display = "- d -u"
;;
pealkiri)
display = "- u"
;;
esac

juhul $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ kuvama $ url;

Muutuja määratletakse, andes sellele nime ja seejärel määranud sellele väärtuse. Eespool toodud näites on järgmised muutujate määramised:

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

Skript on muutujate abil koheselt paremini hallatav. Näiteks käsitletakse kõiki parameetreid eraldi ja seega ei ole pesastatud IF-avaldusi.

Kuvamismuutuja on nüüd seatud sõltuvalt sellest, kas te valisite kõik, kirjeldus või pealkiri ning url-muutuja on seatud aboutdotcom-i muutuja väärtuseks või lxer-muutuja väärtus sõltuvalt sellest, kas valisite aboutdotcom või lxer.

Rsstaili käsk peab nüüd lihtsalt näitama ekraani ja URL-i väärtust õigesti töötama.

Kuigi muutujad määratakse lihtsalt nime andmisega, peate nende ees asetama $ -märgi. Teisisõnu määrab muutuja = väärtus väärtuseks muutuja, samas kui $ variaator annab mulle muutuja sisu.

Järgmine on selle juhendaja lõplik skript.

#! / 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"
kasutus = "kasutus: rssget.sh [kõik | kirjeldus | pealkiri] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
kuva = ""
url = ""

kui [$ # -lt 2] || [$ # -gt 2]
siis
echo $ kasutamine;
väljumine;
fi

juhul $ 1 in
kõik)
kuva = "- d -l -u"
;;
kirjeldus)
display = "- d -u"
;;
pealkiri)
display = "- u"
;;
*)
echo $ kasutamine;
väljumine;
;;
esac

juhul $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
igadaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ kasutamine;
väljumine;
esac

rsstail $ kuvama $ url;

Ülaltoodud skript tutvustab rohkem RSS-vooge ja seal on kasutamismuutuur, mis ütleb kasutajale, kuidas skripti kasutada, kui nad ei sisesta 2 muutujat või sisestavad muutujad vale valikuid.

Kokkuvõte

See on eepiline artikkel ja see võib tulla liiga vara liiga kaugele. Järgmises juhendis näitan sulle kõiki IF avalduste võrdlusvõimalusi ja muutujaid on veel palju rääkida.

Eespool nimetatud skripti parandamiseks on veelgi rohkem, ja seda käsitletakse tulevaste juhendite puhul, kui uurime silmuseid, grep ja regulaaravaldisi.

Tutvuge l-inux.about.com jaotist "Kuidas lugeda artiklite loendisse", et leida kasulikke juhendeid Windowsi ja Ubuntu kahesüsteemse käivitamise kohta virtuaalse masina loomiseks GNOME-kastide abil .