Introduksjon
Velkommen til den tredje delen av "Beginners Guide To BASH". Hvis du har gått glipp av de to foregående artiklene, vil du sannsynligvis vil vite hva som gjør denne veiledningen annerledes enn andre BASH-skriptguider.
Denne veiledningen blir skrevet av en komplett nybegynner til BASH, og slik som en leser lærer du som jeg lærer. Mens jeg er en nybegynner til BASH, kommer jeg fra en programvareutviklingsbakgrunn, selv om de fleste av de tingene jeg har skrevet har vært for Windows-plattformen.
Du kan se de to første guider ved å besøke:
- Nybegynnere Guide til BASH - Hello World
- Nybegynnere Guide til BASH - Inngangsparametere
Hvis du er ny på BASH-skripting, anbefaler jeg at du leser de to første guiderne før du fortsetter med denne.
I denne veiledningen vil jeg fremheve hvordan du bruker betingede setninger for å teste brukerinngang og for å kontrollere hvordan et skript fungerer.
Installer rsstail
For å følge denne veiledningen må du installere et kommandolinjeapplikasjon kalt rsstail som brukes til å lese RSS-feeder.
Hvis du bruker en Debian / Ubuntu / Mint-basert distribusjonstype, følger du følgende:
sudo apt-get install rsstail
For Fedora / CentOS etc skriver du inn følgende:
Du installerer rsstail
For openSUSE skriver du følgende:
Zypper installer rsstail
IF-setningen
Åpne en terminal og opprett en fil som heter rssget.sh ved å skrive følgende:
sudo nano rssget.sh
Innenfor nano-editoren skriver du inn følgende tekst:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Lagre filen ved å trykke CTRL og O og avslutte ved å trykke CTRL og X.
Kjør skriptet ved å skrive følgende:
sh rssget.sh
Skriptet vil returnere en liste over titler fra linux.about.com RSS-feed.
Det er ikke et altfor nyttig skript fordi det bare henter titlene fra en RSS-feed, men det sparer å måtte huske banen til Linux.about.com RSS-feed.
Åpne rssget.sh-skriptet i nano igjen, og rediger filen for å se slik ut:
#! / Bin / bash
hvis $ 1 = "verbose"deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Kjør skriptet igjen ved å skrive følgende:
sh rssget.sh verbose
Denne gangen kommer RSS-strømmen tilbake med tittelen, lenken og beskrivelsen.
La oss analysere skriptet i detalj:
#! / Bin / bash vises i hvert script vi skriver. Neste linje ser i utgangspunktet på den første inngangsparameteren som er oppgitt av brukeren, og sammenligner den med ordet "verbose". Hvis inngangsparameteren og ordet "verbose" samsvarer med linjene mellom deretter og fi er sprang.
Ovennevnte skript er åpenbart feil. Hva skjer hvis du ikke gir en inngangsparameter i det hele tatt? Svaret er at du får en feil i tråd med uventet operatør.
Den andre store feilen er at hvis du ikke gir ordet "verbose", skjer ingenting i det hele tatt. Ideelt sett hvis du ikke gir ordet, vil skriptet returnere en liste over titler.
Bruk nano igjen for å redigere filen rssget.sh og endre koden som følger:
#! / Bin / bash
hvis $ 1 = "verbose"deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Lagre filen og kjør den ved å skrive følgende:
sh rssget.sh verbose
En liste over titler, beskrivelser og lenker vises. Kjør det igjen på følgende måte:
sh rssget.sh titler
Denne gangen vises bare en liste over titler.
Den ekstra delen av skriptet er på linje 4 og introduserer ellers uttalelse. I utgangspunktet sier skriptet nå om den første parameteren er ordet "verbose", få beskrivelsen, linkene og titlene for RSS-feed, men hvis den første parameteren er noe annet, bare få en liste over titler.
Skriptet har forbedret seg litt, men er fortsatt feil. Hvis du ikke angir en parameter, vil du fortsatt få en feil. Selv om du gir en parameter, betyr bare at du ikke vil ha ordentlig, men du vil bare ha titler. Du har kanskje bare stavet verbalt feil for eksempel, eller du kan ha skrevet duer som selvfølgelig er meningsløs.
Før vi prøver å fjerne disse problemene, vil jeg vise deg en ekstra kommando som går med IF-setningen.
Rediger ditt rssget.sh-skript for å se på følgende måte:
#! / Bin / bash
hvis $ 1 = "alle"deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "beskrivelse"deretter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Jeg bestemte meg for å bli kvitt ordet verbose og erstattet det med alle. Det er ikke den viktige delen. Skriptet ovenfor introduserer elif som er en kort måte å si ELSE IF.
Nå fungerer skriptet som følger. Hvis du kjører sh rssget.sh alt så får du beskrivelser, lenker og titler. Hvis du i stedet bare kjører sh rssget.sh beskrivelseDu vil bare få titler og beskrivelser. Hvis du gir noe annet ord, får du en liste over titler.
Dette introduserer en måte å raskt komme opp med en liste over betingede utsagn. En alternativ måte å gjøre ELIF på er å bruke det som kalles nestede IF-setninger.
Følgende er et eksempel som viser hvordan nestede IF-setninger fungerer:
#! / Bin / bash
hvis $ 2 = "omdotcom"deretter hvis $ 1 = "alle" deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" deretter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fiellers hvis $ 1 = "alle" deretter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" deretter rsstail -d -u http://lxer.com/module/newswire/headlines.rss ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Ta gjerne inn alt det hvis du vil, eller kopier og lim inn det i rssget.sh-filen din.
Ovennevnte skript introduserer en andre parameter som lar deg velge enten "about.com" eller "lxer.com" en en RSS-feed.
For å kjøre det skriver du inn følgende:
Sh rssget.sh all aboutdotcom
eller
sk rssget.sh alle lxer
Du kan selvfølgelig erstatte alle med beskrivelser eller titler for å gi bare beskrivelser eller bare titler.
I utgangspunktet sier koden ovenfor om den andre parameteren er omdotcom, så se på den andre hvis setningen er den samme fra det forrige skriptet ellers hvis den andre parameteren er lxer, så se på den indre om setningen igjen for å bestemme om titler, beskrivelser skal vises eller alt.
Det skriptet er gitt rent som et eksempel på en nestet IF-setning og det er så mange ting galt med det skriptet det ville ta en annen artikkel for å forklare dem alle. Hovedproblemet er at det ikke er skalerbart.
Tenk deg at du ønsket å legge til et annet RSS-feed som Everyday Linux-bruker eller Linux i dag? Skriptet ville bli stort, og hvis du bestemte deg for at du ville at den indre IF-setningen skulle forandre deg, måtte du endre den på flere steder.
Mens det er tid og sted for en nestet IF, bør de brukes sparsomt. Det er vanligvis en måte å refactor koden din slik at du ikke trenger den nestede IF i det hele tatt. Jeg vil komme videre til dette emnet i en fremtidig artikkel.
La oss nå se på å løse problemet med folk som skriver inn duff-parametere. For eksempel i skriptet ovenfor hvis brukeren går inn i noe annet enn "omdotcom" som 2. parameter, vises en liste over artikler fra RSS-feed fra LXER, uansett om brukeren skriver inn lxer eller ikke.
I tillegg hvis brukeren ikke skriver inn "alle" eller "beskrivelse" som 1. parameter, er standard en liste over titler som kanskje eller ikke er hva brukeren hadde til hensikt.
Se på følgende skript (eller kopier og lim det inn i din rssget.sh-fil.
#! / Bin / bash
hvis $ 2 = "omdotcom" || $ 2 = "lxer"deretter hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "tittel" deretter hvis $ 2 = "omdotcom" deretter hvis $ 1 = "alle" deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" deretter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi ellers hvis $ 1 = "alle" deretter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" deretter rsstail -d -u http://lxer.com/module/newswire/headlines.rss ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Det første du må merke seg er at manuset nå blir ganske stort, og du kan raskt se hvordan utelukkende IF-setninger kan bli.
Biten som er viktig i dette skriptet er IF-setningen || erklære den delen på linje 2 og linje 4.
|| står for OR. Så linjenhvis $ 2 = "omdotcom" || $ 2 = "lxer"kontrollerer om den andre parameteren er lik "omdotcom" eller "lxer". Hvis ikke, er IF-erklæringen fullført fordi det ikke er noe ellers uttalelse for den ytre mest HVIS.
På linje 4 på linjen hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "tittel"kontrollerer om den første parameteren er lik «alt» eller «beskrivelse» eller «tittel».
Nå hvis brukeren kjørersh rssget.sh poteter ostingenting returneres, men før de ville ha fått en liste over titler fra LXER.
Det motsatte av || er &&. && operatøren står for AND.
Jeg skal få skriptet til å se enda mer ut som et mareritt, men det gjør all viktig kontroll for å sikre at brukeren har gitt 2 parametere.
#! / Bin / bash
hvis $ # -eq 2deretter
hvis $ 2 = "omdotcom" || $ 2 = "lxer" deretter hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "tittel" deretter hvis $ 2 = "omdotcom" deretter hvis $ 1 = "alle" deretter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" deretter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi ellers hvis $ 1 = "alle" deretter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" deretter rsstail -d -u http://lxer.com/module/newswire/headlines.rss ellers rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Det eneste som er ekstra i dette skriptet er en annen ytre IF-setning som følger:hvis $ # -eq 2. Hvis du leser artikkelen om inngangsparametre, vet du at $ # returnerer en telling av antall inngangsparametere. -Eq står for likeverdige. IF-setningen kontrollerer derfor at brukeren skrev inn to parametere, og hvis de ikke bare gikk ut uten å gjøre noe. (Ikke spesielt vennlig).
Jeg er klar over at denne opplæringen blir ganske stor. Det er ikke mye mer å dekke denne uken, men jeg vil bidra til å rydde opp skriptet før vi er ferdige.
Den siste kommandoen du trenger å lære om betingede utsagn er CASE-setningen.
#! / Bin / bash
hvis $ # -eq 2deretter saken $ 2 i aboutdotcom) saken $ 1 i alle) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; beskrivelse) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; tittel) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; ESAC ;; lxer) saken $ 1 i alle) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; beskrivelse) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; tittel) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; ESAC ;; ESACfi
Saksoppgaven er en finere måte å skrive IF ELSE ELLER ELSE IF IF IF. For eksempel denne logikken IF frukt = bananerSå detteELLER OM frukt = appelsinerSå detteELLER OM frukt = druerSå detteSLUTT OM kan omskrives som: saken frukt i bananer) gjør dette ;; appelsiner) gjør dette ;; druer) gjør dette ;;ESAC I utgangspunktet er det første elementet etter saken den tingen du skal sammenligne (dvs. frukt). Deretter er hvert element før brakettene det du sammenligner mot, og hvis det samsvarer med linjene som ligger foran ;; vil bli løpende. En saksoppgave avsluttes med omvendt esac (som er tilfelle bakover). I rssget.sh-skriptet fjerner saken setningen noe av det forferdelige nestingen, selv om det ikke virkelig forbedrer det nok. For å virkelig forbedre skriptet må jeg presentere deg for variabler. Se på følgende kode: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" hvis $ # -lt 2 || $ # -gt 2deretter ekko "bruk: rssget.sh all | beskrivelse | tittel omdotcom | lxer"; exit;fi saken $ 1 i alle) display = "- d -l -u" ;; beskrivelse) display = "- d -u" ;; tittel) display = "- u" ;;ESAC saken $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;ESACrsstail $ display $ url; En variabel defineres ved å gi den et navn og deretter tildele en verdi til den. I eksemplet ovenfor er følgende variabler oppgaver: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" Skriptet er øyeblikkelig mer overskuelig ved å bruke variabler. For eksempel håndteres hver parameter separat, og så er det ingen nestede IF-setninger. Visningsvariabelen er nå angitt avhengig av om du valgte alt, beskrivelse eller tittel, og URL-variabelen er satt til verdien av omdotcom-variabelen eller verdien av lxer-variabelen avhengig av om du valgte omdotcom eller lxer. Rsstail-kommandoen trenger nå bare å bruke verdien av skjerm og url for å kjøre riktig. Mens variabler er satt bare ved å gi dem et navn, for å faktisk bruke dem må du sette et $ tegn foran dem. Med andre ord variabel = verdien setter variabel til en verdi mens $ variable betyr gi meg innholdet i variabelen. Følgende er sluttskriptet for denne opplæringen. #! / 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"bruk = "bruk: rssget.sh all | beskrivelse | tittel lxer | omdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" hvis $ # -lt 2 || $ # -gt 2deretter ekko $ bruk; exit;fi saken $ 1 i alle) display = "- d -l -u" ;; beskrivelse) display = "- d -u" ;; tittel) display = "- u" ;; *) ekko $ bruk; exit; ;;ESAC saken $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) ekko $ bruk; exit;ESAC rsstail $ display $ url; Ovennevnte skript introduserer flere RSS-feeder og det er en bruksvariabel som forteller brukeren hvordan man bruker skriptet hvis de heller ikke oppgir 2 variabler eller de angir feilalternativer for variablene. Dette har vært en episk artikkel og kan ha gått for langt for tidlig. I neste veiledning vil jeg vise deg alle sammenligningsalternativene for IF-setninger, og det er fortsatt mye mer å snakke om med hensyn til variabler. Det er også flere som kan gjøres for å forbedre det ovennevnte skriptet, og dette vil bli dekket i fremtidige guider når vi undersøker sløyfer, grep og regulære uttrykk. Sjekk ut hvordan du kan (bla nedover kategoriene for å se en liste over artikler) i linux.about.com for å finne flere nyttige guider fra Dual Booting Windows og Ubuntu for å sette opp en virtuell maskin ved hjelp av GNOME-bokser. Sammendrag