Skip to main content

Beginners Guide to Bash - Betingelser Og Variabler

Qt Tutorials For Beginners 2 - How to Install Qt Creator IDE (Open Source Version) (April 2025)

Qt Tutorials For Beginners 2 - How to Install Qt Creator IDE (Open Source Version) (April 2025)
Anonim

Introduktion

Velkommen til den tredje del af "Beginners Guide To BASH". Hvis du har gået glip af de to foregående artikler, vil du sikkert gerne vide, hvad der gør denne vejledning anderledes end andre BASH-scriptguides.

Denne vejledning bliver skrevet af en komplet nybegynder til BASH og så som en læser lærer du som jeg lærer. Mens jeg er en nybegynder til BASH, kommer jeg fra en softwareudviklingsbakgrund, selv om de fleste af de ting, jeg har skrevet, har været for Windows-platformen.

Du kan se de to første guider ved at besøge:

  • Beginners Guide til BASH - Hej World
  • Begyndervejledning til BASH - Input Parametre

Hvis du er ny til BASH scripting, anbefaler jeg at læse de to første guider, inden du fortsætter med denne.

I denne vejledning vil jeg fremhæve, hvordan man bruger betingede udsagn til at teste brugerindgang og til at kontrollere, hvordan et script fungerer.

Installer rsstail

For at følge denne vejledning skal du installere en kommandolinjeprogram kaldet rsstail, som bruges til at læse RSS-feeds.

Hvis du bruger en Debian / Ubuntu / Mint-baseret distributionstype, følger du følgende:

sudo apt-get install rsstail

For Fedora / CentOS osv. Skriv følgende:

Du installerer rsstail

For openSUSE skal du skrive følgende:

zypper installer rsstail

IF-erklæringen

Åbn en terminal og opret en fil kaldet rssget.sh ved at skrive følgende:

sudo nano rssget.sh

Inden for nano-editoren skal du indtaste følgende tekst:

#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Gem filen ved at trykke på CTRL og O og derefter afslutte ved at trykke på CTRL og X.

Kør scriptet ved at skrive følgende:

sh rssget.sh

Scriptet vil returnere en liste over titler fra linux.about.com RSS feed.

Det er ikke et alt for nyttigt script, fordi det bare henter titlerne fra et RSS-feed, men det sparer at skulle huske stien til Linux.about.com RSS-feed.

Åbn rssget.sh scriptet i nano igen og rediger filen for at se på følgende måde:

#! / Bin / bash

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

Kør scriptet igen ved at skrive følgende:

sh rssget.sh verbose

Denne gang kommer RSS-feedet tilbage med titlen, linket og beskrivelsen.

Lad os analysere scriptet lidt detaljeret:

#! / Bin / bash vises i hvert script vi skriver. Næste linje ser grundlæggende på den første indgangsparameter, som brugeren giver, og sammenligner den med ordet "verbose". Hvis input parameteren og ordet "verbose" matcher linjerne mellem derefter og fi er løb.

Ovennævnte script er naturligvis fejlbehæftet. Hvad sker der, hvis du slet ikke angiver en inputparameter? Svaret er, at du får en fejl i takt med uventet operatør.

Den anden store fejl er, at hvis du ikke giver ordet "verbose" så sker der slet ingenting. Ideelt, hvis du ikke giver ordet verbose, vil scriptet returnere en liste over titler.

Brug nano igen til at redigere filen rssget.sh og ændre koden som følger:

#! / Bin / bash

hvis $ 1 = "verbose"derefter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi

Gem filen og kør den ved at skrive følgende:

sh rssget.sh verbose

En liste over titler, beskrivelser og links vises. Kør det igen igen som følger:

sh rssget.sh titler

Denne gang vises en liste over titler.

Den ekstra del af scriptet er på linje 4 og introducerer andet udmelding. Grundlæggende siger scriptet nu, om den første parameter er ordet "verbose" få beskrivelsen, linkene og titlerne til RSS-feedet, men hvis den første parameter er noget andet, få bare en liste over titler.

Scriptet er forbedret lidt, men det er stadig mangelfuldt. Hvis du ikke indtaster en parameter, får du stadig en fejl. Selvom du giver en parameter, betyder det bare at sige, at du ikke vil have verbose, at du kun vil have titler. Du har muligvis bare stavet forkert forkert, for eksempel, eller du kan have skrevet duer, som selvfølgelig er meningsløs.

Før vi forsøger at fjerne disse problemer, vil jeg gerne vise dig en kommando, der følger med IF-erklæringen.

Rediger dit rssget.sh script for at se som følger:

#! / Bin / bash

hvis $ 1 = "alle"derefter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "beskrivelse"derefter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Jeg besluttede at slippe af med ordet verbose og erstatte det med alle. Det er ikke den vigtige del. Skriptet ovenfor introducerer Elif hvilket er en kort måde at sige ELSE IF.

Nu fungerer scriptet som følger. Hvis du løber sh rssget.sh alle så får du beskrivelser, links og titler. Hvis du i stedet bare kører sh rssget.sh beskrivelseDu får bare titler og beskrivelser. Hvis du leverer et andet ord, får du en liste over titler.

Dette introducerer en måde at hurtigt komme op på en liste over betingede udsagn. En alternativ måde at gøre ELIF på er at bruge, hvad der er kendt som indlejrede IF-udsagn.

Nedenstående er et eksempel på hvordan indlejrede IF-sætninger virker:

#! / Bin / bash

hvis $ 2 = "omdotcom"derefter hvis $ 1 = "alle" derefter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" derefter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fiandet hvis $ 1 = "alle" derefter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" derefter rsstail -d -u http://lxer.com/module/newswire/headlines.rss andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi

Du er velkommen til at skrive alt det ind, hvis du kan lide eller kopiere og indsætte det i din rssget.sh-fil.

Ovenstående script introducerer en 2. parameter, som lader dig vælge enten "about.com" eller "lxer.com" et RSS-feed.

For at køre det skal du skrive følgende:

sh rssget.sh alle omdotcom

eller

sh rssget.sh alle lxer

Du kan selvfølgelig erstatte alle med beskrivelser eller titler for at give bare beskrivelser eller bare titler.

I grunden siger koden ovenfor, hvis den anden parameter er omdotcom, så kig på den anden hvis sætning er den samme fra det foregående script ellers hvis den anden parameter er lxer, så kig på den indre if-sætning igen for at afgøre, om titler, beskrivelser skal vises eller alting.

Dette script er udelukkende givet som et eksempel på en indlejret IF-erklæring, og der er så mange ting galt med det script, det ville tage en anden artikel for at forklare dem alle. Hovedproblemet er, at det ikke er skalerbart.

Forestil dig, at du ønskede at tilføje et andet RSS-feed som Everyday Linux User eller Linux Today? Scriptet ville blive stort, og hvis du besluttede at du ønskede, at den indre IF-erklæring skulle ændre dig, ville du skulle ændre den på flere steder.

Mens der er tid og sted for en nestet IF, skal de bruges sparsomt. Der er normalt en måde at refactor din kode på, så du ikke behøver den indlejrede IF overhovedet. Jeg vil komme videre til dette emne i en fremtidig artikel.

Lad os nu se på at fastsætte spørgsmålet om folk, der indtaster duff-parametre. For eksempel i scriptet ovenfor, hvis brugeren kommer ind i noget andet end "omdotcom" som 2. parameter, vises en liste over artikler fra RSS-feed fra LXER, uanset om brugeren indtaster lxer eller ej.

Hvis brugeren ikke indtaster "alle" eller "beskrivelse" som 1. parameter, er standardmenuen en liste over titler, som måske eller ej er, hvad brugeren har til hensigt.

Se på følgende script (eller kopier og indsæt det i din rssget.sh-fil.

#! / Bin / bash

hvis $ 2 = "aboutdotcom" || $ 2 = "lxer"derefter hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "titel" derefter hvis $ 2 = "omdotcom" derefter hvis $ 1 = "alle" derefter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" derefter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi andet hvis $ 1 = "alle" derefter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" derefter rsstail -d -u http://lxer.com/module/newswire/headlines.rss andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi

Den første ting at bemærke er, at scriptet nu bliver ret stort, og du kan hurtigt se, hvordan ikke-kontrollerede indlejrede IF-udsagn kan blive.

Den bit, der er vigtig i dette script er IF-sætningen || erklæring DET afsnit på linje 2 og linje 4.

The || står for OR. Så linjenhvis $ 2 = "aboutdotcom" || $ 2 = "lxer"kontrollerer, om den anden parameter er lig med "aboutdotcom" eller "lxer". Hvis det ikke er, er IF-erklæringen færdig, fordi der ikke er nogen andet erklæring for det yderste HVIS.

Ligeledes på linje 4 linjen hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "titel"kontrollerer, om den første parameter er lig med enten "alle" eller "beskrivelse" eller "titel".

Nu, hvis brugeren kørersh rssget.sh kartofler ostintet er returneret, før de ville have modtaget en liste over titler fra LXER.

Det modsatte af || er &&. && operatøren står for AND.

Jeg skal få scriptet til at se endnu mere ud som et mareridt, men det gør den vigtige check for at sikre, at brugeren har leveret 2 parametre.

#! / Bin / bash

hvis $ # -eq 2derefter

hvis $ 2 = "aboutdotcom" || $ 2 = "lxer" derefter hvis $ 1 = "alle" || $ 1 = "beskrivelse" || $ 1 = "titel" derefter hvis $ 2 = "omdotcom" derefter hvis $ 1 = "alle" derefter rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivelse" derefter rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi andet hvis $ 1 = "alle" derefter rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivelse" derefter rsstail -d -u http://lxer.com/module/newswire/headlines.rss andet rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi

Den eneste smule der er ekstra i dette script er en anden ydre IF-erklæring som følger:hvis $ # -eq 2. Hvis du læser artiklen om indgangsparametre, vil du vide, at $ # returnerer et tal af antallet af indgangsparametre. -Qq står for ligestilling. IF-erklæringen kontrollerer derfor, at brugeren har indtastet 2 parametre, og hvis de ikke lige gik ud uden at gøre noget. (Ikke særlig venlig).

Jeg er klar over, at denne vejledning bliver ganske stor. Der er ikke meget mere at dække i denne uge, men jeg vil hjælpe med at rydde scriptet inden vi er færdige.

Den sidste kommando, som du skal lære om betingede udsagn, er CASE-sætningen.

#! / Bin / bash

hvis $ # -eq 2derefter tilfælde $ 2 i aboutdotcom) tilfælde $ 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 ;; titel) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; ESAC ;; lxer) tilfælde $ 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 ;; titel) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; ESAC ;; ESACfi

Sagsopgørelsen er en pænere måde at skrive IF IF ELSE ELLER ELSE ELLER ELSE IF.

For eksempel denne logik

Hvis frugt = bananerDerefter detteEllers IF frugt = appelsinerDerefter detteEllers IF frugt = druerDerefter detteAFSLUT HVIS

kan omskrives som:

sag frugt i bananer) gør dette ;; appelsiner) gør dette ;; druer) gør dette ;;ESAC

I grund og grund er det første punkt efter sagen den ting, du skal sammenligne (dvs. frugt). Så er hvert punkt inden parentes det, du sammenligner imod, og hvis det matcher linjene forud for; vil blive løbet. En sagen er afsluttet med den omvendte esac (som er tilfældet bagud).

I rssget.sh scriptet fjerner sagen erklæringen noget af det forfærdelige nest, selvom det ikke virkelig forbedrer det nok.

For virkelig at forbedre scriptet skal jeg introducere dig til 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 2derefter ekko "brug: rssget.sh all | beskrivelse | titel omdotcom | lxer"; Afslut;fi

tilfælde $ 1 i alle) display = "- d -l -u" ;; beskrivelse) display = "- d -u" ;; titel) display = "- u" ;;ESAC

tilfælde $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;ESACrsstail $ display $ url;

En variabel defineres ved at give den et navn og derefter tildele en værdi til den. I ovenstående eksempel er følgende variabler opgaver:

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

Skriptet er øjeblikkeligt mere overskueligt ved hjælp af variabler. For eksempel håndteres hver parameter separat, og der er således ingen indlejrede IF-udsagn.

Visningsvariablen er nu indstillet afhængigt af om du valgte alt, beskrivelse eller titel, og url-variablen er indstillet til værdien af ​​omdotcom-variablen eller værdien af ​​lxer-variablen, afhængigt af om du vælger omdotcom eller lxer.

Rsstail-kommandoen skal nu bare bruge værdien af ​​display og url til at køre korrekt.

Mens variabler er indstillet bare ved at give dem et navn, for faktisk at bruge dem skal du lægge et $ tegn foran dem. Med andre ord variable = værdi sæt variabel til en værdi, mens $ variable betyder give mig indholdet af variablen.

Følgende er det endelige script til denne vejledning.

#! / 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"brug = "brug: rssget.sh alle | beskrivelse | titel lxer | omdotcom | everydaylinuxuser | linuxtoday"display = ""url = ""

hvis $ # -lt 2 || $ # -gt 2derefter ekko $ forbrug; Afslut;fi

tilfælde $ 1 i alle) display = "- d -l -u" ;; beskrivelse) display = "- d -u" ;; titel) display = "- u" ;; *) ekko $ forbrug; Afslut; ;;ESAC

tilfælde $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) ekko $ forbrug; Afslut;ESAC

rsstail $ display $ url;

Ovenstående script introducerer flere RSS-feeds, og der er en brugsvariabel, der fortæller brugeren, hvordan man bruger scriptet, hvis de heller ikke indtaster 2 variabler, eller de angiver forkerte muligheder for variablerne.

Resumé

Dette har været en episk artikel og kan være gået alt for hurtigt. I den næste vejledning vil jeg vise dig alle sammenligningsmuligheder for IF-udsagn, og der er stadig meget mere at tale om med hensyn til variabler.

Der er også mere, der kan gøres for at forbedre ovenstående script, og dette vil blive dækket i fremtidige guider, da vi undersøger sløjfer, grep og regulære udtryk.

Se, hvordan du (Scroll ned forbi kategorierne for at se en liste over artikler) afsnittet linux.about.com for at finde flere nyttige guider fra Dual Booting Windows og Ubuntu til at oprette en virtuel maskine, der bruger GNOME-bokse.