Įvadas
Sveiki atvykę į trečiąją "Pradedančiųjų vadovo BASH" dalį. Jei praleidote ankstesnius du straipsnius, tikriausiai norėsite sužinoti, kaip šis vadovas skiriasi nuo kitų BASH scenarijų vadovų.
Šis vadovas yra parašytas visiško naujoko BASH ir kaip skaitytojas, kurį mokate mokytis. Nors aš esu naujokas BASH, aš atėjau iš programinės įrangos kūrimo, nors daugelis dalykų, kuriuos aš parašiau, buvo skirti "Windows" platformai.
Pirmuosius du vadovus galite pamatyti apsilankę:
- Pradedančiųjų vadovas "BASH" - "Hello World"
- Pradedančiųjų vadovas BASH įvesties parametrams
Jei esate naujas BASH scenarijus, aš rekomenduosiu skaityti pirmuosius du vadovus, prieš tęsdami šią versiją.
Šiame vadove norėčiau paryškinti, kaip naudoti sąlygines ataskaitas, kad išbandytumėte naudotojo įvestį ir valdytumėte, kaip veikia scenarijus.
Įdiekite rsstail
Norėdami sekti šį vadovą, turėsite įdiegti komandinės eilutės programą, vadinamą rsstail, kuri yra naudojama skaityti RSS.
Jei naudojate "Debian" / "Ubuntu" / "Mint" paskirstymo tipą, atlikite šiuos veiksmus:
sudo apt-get install rsstail
Jei norite Fedora / CentOS ir tt, įveskite:
yum install rsstail
Norėdami openSUSE įveskite:
zypper įdiegti rsstail
IF teiginys
Atidarykite terminalą ir sukurkite failą rssget.sh, įveskite šiuos duomenis:
Sudo nano rssget.sh
Nano redaktoriuje įveskite šį tekstą:
#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Išsaugokite failą paspausdami CTRL ir O, tada palikdami paspauskite CTRL ir X.
Paleiskite scenarijų, įveskite šį:
sh rssget.sh
Scenarijus grąžins pavadinimų sąrašą iš "RSS" kanalo linux.about.com.
Tai nėra pernelyg naudingas scenarijus, nes jis tiesiog gauna pavadinimus iš vieno RSS kanalo, bet sutaupo, norint prisiminti kelią į "Linux.about.com" RSS kanalą.
Atidarykite scenarijų rssget.sh į nano ir redaguokite failą, kad atrodytų taip:
#! / bin / bash
jei $ 1 = "verbose"tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Dar kartą paleiskite scenarijų, įveskite šiuos duomenis:
sh rssget.sh verbose
Šį kartą RSS kanalas grąžinamas su pavadinimu, nuoroda ir aprašymu.
Šiek tiek išsamiai išnagrinėsime scenarijų:
#! / Bin / bash pasirodo kiekviename scenarijuje, kurį mes rašome. Kitoje eilutėje iš esmės apžvelgiamas pirmas vartotojo įvesties parametras ir lyginamas su žodžiu "verbose". Jei įvesties parametras ir žodis "verbose" atitinka linijas tarp tada ir fi bėgo
Viršuje esantis scenarijus yra akivaizdžiai klaidingas. Kas atsitiks, jei nenurodysite įvesties parametro? Atsakymas yra tai, kad jūs gaunate klaidą netikėto operatoriaus eilutėmis.
Kitas svarbus trūkumas yra tai, kad jei nenurodysite žodžio "verbose", tai niekas neįvyks. Idealiu atveju, jei nesate žodžio verbose, scenarijus grąžins pavadinimų sąrašą.
Dar kartą naudokite nano redaguoti failą rssget.sh ir pakeisti kodą taip:
#! / bin / bash
jei $ 1 = "verbose"tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Išsaugokite failą ir paleiskite jį, įveskite šiuos duomenis:
sh rssget.sh verbose
Bus rodomas pavadinimų, aprašų ir nuorodų sąrašas. Dabar paleiskite jį dar kartą taip:
sh rssget.sh pavadinimai
Šį kartą pasirodys tik pavadinimų sąrašas.
Papildoma scenarijaus dalis yra 4 eilutėje ir pateikiama Kitas pareiškimas. Iš esmės dabar scenarijus sako, kad jei pirmasis parametras yra žodis "verbose", gaukite RSS santraukos aprašymą, nuorodas ir pavadinimus, bet jei pirmasis parametras yra kažkas kitas, tiesiog sugalvokite pavadinimų sąrašą.
Skriptas šiek tiek pagerėjo, bet vis dar yra trūkumų. Jei nepavyks įvesti parametro, vis tiek gausite klaidą. Net jei pateikiate parametrą, tiesiog sakydamas, kad nenorite verbose, nereiškia, kad norite tik pavadinimų. Pavyzdžiui, galbūt tiesiog parašyta neteisingai, arba galbūt įvedėte balandžius, kurie, žinoma, yra beprasmiška.
Prieš bandydami išvalyti šiuos klausimus norėčiau parodyti dar vieną komandą, kuri tinka IF pareiškimui.
Redaguokite savo rssget.sh scenarijų, kad atrodytų taip:
#! / bin / bash
jei $ 1 = "all"tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "aprašymas"tada rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Aš nusprendžiau atsikratyti žodžio verbose ir jį pakeisti visais. Tai nėra svarbi dalis. Viršuje pateikiamas scenarijus elifas kuris yra trumpas būdas pasakyti kitaip.
Dabar scenarijus veikia taip. Jei paleisti sh rssget.sh all tada gaunate aprašymus, nuorodas ir pavadinimus. Jei vietoj to tiesiog paleiskite sh rssget.sh aprašymasjūs tiesiog gausite pavadinimus ir aprašymus. Jei pateikiate bet kurį kitą žodį, gausite pavadinimų sąrašą.
Tai leidžia greičiau pateikti sąlyginių teiginių sąrašą. Alternatyvus elifas būdas yra naudoti tai, kas vadinama įterptais IF pareiškimais.
Toliau pateikiamas pavyzdys, rodantis, kaip įdėtos IF ataskaitos veikia:
#! / bin / bash
jei $ 2 = "aboutdotcom"tada jei $ 1 = "all" tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "aprašymas" tada rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fiKitas jei $ 1 = "all" tada rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "aprašymas" tada rsstail -d -u http://lxer.com/module/newswire/headlines.rss Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Nepamirškite įvesti visko, jei norite, arba nukopijuokite ir įklijuokite jį į savo failą rssget.sh.
Šis scenarijus įveda 2-ąjį parametrą, kuris leidžia pasirinkti "about.com" arba "lxer.com" RSS.
Norėdami jį paleisti įveskite:
sh rssget.sh all aboutdotcom
arba
sh rssget.sh viskas lxer
Žinoma, galite pakeisti visus aprašus ar pavadinimus, kad pateiktumėte tik aprašymus ar tiesiog pavadinimus.
Iš esmės aukščiau pateiktas kodas sako, jei antrasis parametras yra aboutdotcom, tada pažvelkite į antrąjį, jei tas teiginys yra tas pats, kuris yra iš ankstesnio scenarijaus, jei antrasis parametras yra lxer, tada pažiūrėkite į vidinį if sakinį dar kartą, jei norite nuspręsti, ar rodyti antraštes, aprašymus ar viskas.
Šis scenarijus pateikiamas tik kaip įterpto IF pranešimo pavyzdys, ir tai yra labai daug dalykų, dėl kurių šis scenarijus būtų klaidingas, viską paaiškintų dar vienas straipsnis. Pagrindinis klausimas yra tas, kad jis nėra keičiamas.
Įsivaizduokite, kad norėjote pridėti kitą RSS tiekimą, pvz., Kasdieninį "Linux" naudotoją ar "Linux Today"? Skriptas taps didžiulis, ir jei nuspręsite, kad norite, kad vidinis IF pareiškimas pasikeistų, jį turėtumėte keisti įvairiose vietose.
Nors yra laikas ir vieta įtvirtinti, jei jie turėtų būti naudojami taupiai. Paprastai yra būdas kodą ištaisyti, kad jums nieko nereikia. Aš ateisiu į šį dalyką būsimame straipsnyje.
Dabar pažvelkime į klausimą, ar žmonės įvedami į parametrus. Pavyzdžiui, aukščiau pateiktame scenarijuje, jei naudotojas įveskite kažką kitą, o ne "aboutdotcom" kaip 2-ąjį parametrą, straipsnių sąrašas pasirodo iš "LXER" RSS kanalo, nepriklausomai nuo to, ar vartotojas įveda "lxer", ar ne.
Be to, jei vartotojas neįrašo "all" arba "description" kaip 1-ojo parametro, pagal nutylėjimą yra pavadinimų sąrašas, kuris gali būti arba nebūti toks, koks numatytas vartotojui.
Pažvelkite į šį scenarijų (arba nukopijuokite ir įklijuokite jį į savo failą rssget.sh.
#! / bin / bash
jei $ 2 = "aboutdotcom" || $ 2 = "lxer"tada jei $ 1 = "all" || $ 1 = "aprašymas" || $ 1 = "pavadinimas" tada jei $ 2 = "aboutdotcom" tada jei $ 1 = "all" tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "aprašymas" tada rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi Kitas jei $ 1 = "all" tada rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "aprašymas" tada rsstail -d -u http://lxer.com/module/newswire/headlines.rss Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Pirmasis dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad scenarijus dabar tampa gana didelis, ir jūs galite greitai sužinoti, kaip iš valdymo įterptų IF pareiškimų gali tapti.
Šiame scenarijuje svarbus bitas yra IF teiginys || pareiškimas THEN skyriuje 2 eilutėje ir 4 eilutėje.
|| reiškia "OR". Taigi linijajei $ 2 = "aboutdotcom" || $ 2 = "lxer"patikrina, ar 2 parametras yra lygus "aboutdotcom" arba "lxer". Jei ne, tada IF pareiškimas yra baigtas, nes jo nėra Kitas pareiškimas dėl išorės labiausiai Jei
Panašiai į liniją 4 linija jei $ 1 = "all" || $ 1 = "aprašymas" || $ 1 = "pavadinimas"patikrina, ar 1 parametras yra lygus arba "visiems", "aprašymui" ar "antraštinei daliai".
Dabar, kai vartotojas paleidžiash rssget.sh bulvių sūrisniekas nėra sugrąžintas, nes prieš tai jie būtų gavę LXER pavadinimų sąrašą.
Priešingai nei || is && & & Operatorius reiškia AND.
Aš padarysiu, kad scenarijus atrodytų dar labiau kaip košmaras, tačiau jis atlieka visus svarbius patikrinimus, kad įsitikintų, jog vartotojas pateikė 2 parametrus.
#! / bin / bash
jei $ # -eq 2tada
jei $ 2 = "aboutdotcom" || $ 2 = "lxer" tada jei $ 1 = "all" || $ 1 = "aprašymas" || $ 1 = "pavadinimas" tada jei $ 2 = "aboutdotcom" tada jei $ 1 = "all" tada rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "aprašymas" tada rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi Kitas jei $ 1 = "all" tada rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "aprašymas" tada rsstail -d -u http://lxer.com/module/newswire/headlines.rss Kitas rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Vienintelis bitas, kuris papildomas šiame scenarijuje, yra kitas išorinis IF teiginys:jei $ # -eq 2. Jei perskaitysite straipsnį apie įvesties parametrus, jūs žinote, kad $ # grąžina įvesties parametrų skaičių. "-Eq" reiškia lygias. Todėl IF teiginys patikrina, ar vartotojas įvedė 2 parametrus, ir jei jie ne tik išeina be nieko. (Nėra ypač draugiška).
Aš žinau, kad šis vadovėlis tampa gana didelis. Šią savaitę nėra daug daugiau, bet norėčiau padėti tvarkyti scenarijų, kol mes baigsime.
Vienintelė paskutinė komanda, kurią reikia sužinoti apie sąlygines ataskaitas, yra CASE teiginys.
#! / bin / bash
jei $ # -eq 2tada 2 USD atvejis aboutdotcom) atvejis $ 1 vnt visi) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; apibūdinimas) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; pavadinimas) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) atvejis $ 1 vnt visi) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; apibūdinimas) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; pavadinimas) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Byla yra geresnis rašymo būdas, KAD KITA, KAD JEI JEIGU, KADA JEIGU KITA. Pavyzdžiui, ši logika Jei vaisius = bananaiTada taiELSE IF vaisiai = apelsinaiTada taiELSE IF vaisiai = vynuogėsTada taiPABAIGA IF gali būti perrašytas kaip: atvežtas vaisius bananai) daryk tai ;; apelsinai) daryk tai ;; vynuogės) daryk tai ;;esac Iš esmės pirmas dalykas po bylos yra dalykas, kurį ketinate palyginti (t. Y. Vaisius). Tada kiekvienas elementas prieš skliaustus yra dalykas, su kuriuo lyginate, ir ar jis atitinka linijas prieš ;; bus bėgti. Byla pasibaigia naudojant atvirkštinį esac (kuris yra atvirkščiai). Rssject.sh scenarijuje bylos ataskaita pašalina kai kurias šias baisias lizdus, nors iš tiesų to nepakankamai tobulina. Norint iš tikrųjų patobulinti scenarijų, reikia įvesti jus į kintamuosius. Pažvelkite į tokį kodą: #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"ekranas = ""url = "" jei $ # -lt 2 || $ # -gt 2tada echo "naudojimo: rssget.sh all | aprašymas | pavadinimas aboutdotcom | lxer"; išeiti;fi atvejis $ 1 vnt visi) rodyti = "-d -l -u" ;; apibūdinimas) Rodyti = "- d -u" ;; pavadinimas) display = "- u" ;;esac 2 USD atvejis aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esac$ rsstail $ $ url; Kintamasis apibrėžiamas suteikiant jam vardą ir paskui jam priskiriant vertę. Pirmiau pateiktame pavyzdyje yra šie kintamųjų paskyrimai: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"ekranas = ""url = "" Naudojant kintamuosius, scenarijus yra lengviau valdomas. Pavyzdžiui, kiekvienas parametras tvarkomas atskirai, todėl nėra įterptų IF pareiškimų. Rodiklio kintamasis dabar nustatomas priklausomai nuo to, ar pasirinkote viską, apibūdinimą ar pavadinimą, o URL-kintamasis yra nustatytas apie aboutdotcom kintamojo reikšmę arba lxer kintamojo reikšmę, priklausomai nuo to, ar pasirinkote aboutdotcom ar lxer. Dabar "rsstail" komanda turi tiesiog naudoti rodymo ir url reikšmę. Nors kintamieji yra nustatomi tik suteikiant jiems vardą, iš tikrųjų juos naudoti, turite įdėti $ ženklas priešais juos. Kitaip tariant, kintamasis = reikšmė nustato kintamąjį reikšmę, o $ kintamasis reiškia man kintamojo turinį. Toliau pateikiamas galutinis šio vadovo scenarijus. #! / 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"Naudojimas = "naudojimas: rssget.sh visi | aprašymas | pavadinimas lxer | aboutdotcom | everydaylinuxuser | linuxtoday"ekranas = ""url = "" jei $ # -lt 2 || $ # -gt 2tada echo $ naudojimo; išeiti;fi atvejis $ 1 vnt visi) rodyti = "-d -l -u" ;; apibūdinimas) Rodyti = "- d -u" ;; pavadinimas) display = "- u" ;; *) echo $ naudojimo; išeiti; ;;esac 2 USD atvejis aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; kasdienlinuxuser) url = $ everydaylinuxuser; ;; *) echo $ naudojimo; išeiti;esac $ rsstail $ $ url; Viršuje esantis scenarijus įveda daugiau RSS kanalų ir yra naudojimo kintamasis, kuris vartotojui nurodo, kaip naudoti scenarijų, jei jie arba neįveda 2 kintamųjų arba jie įveda neteisingas kintamųjų parinktis. Tai buvo epic straipsnis ir galbūt pernelyg pernelyg anksti. Kitame vadove parodysiu visas IF variantų palyginimo galimybes, o kalbant apie kintamuosius dar daug daugiau. Taip pat galima padaryti daugiau, kad būtų patobulintas anksčiau pateiktas scenarijus, o tai bus nagrinėjama būsimose gairėse, kai mes ieškome kilpų, grep ir reguliarių išraiškų. Peržiūrėkite "linux.about.com" skiltyje "How to" (slinkite žemyn kategorijų sąraše, kad pamatytumėte straipsnių sąrašą), kad surastumėte daugiau naudingų žinynų iš "Windows" ir "Ubuntu" paleidimo dviem paleidžiant virtualią mašiną naudojant GNOME dėžutes. Santrauka