Skip to main content

Beginners Guide To Bash - Betingelser Og Variabler

Supersection 1, More Comfortable (April 2025)

Supersection 1, More Comfortable (April 2025)
Anonim

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.

Sammendrag

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.