Invoering
Welkom bij het derde deel van de "Beginners Guide To BASH". Als u de vorige twee artikelen hebt gemist, wilt u waarschijnlijk weten wat deze gids anders maakt dan andere BASH-scripthandleidingen.
Deze gids wordt geschreven door een complete beginner bij BASH en dus leer je als lezer wat ik leer. Hoewel ik een beginner voor BASH ben, kom ik wel uit een softwareontwikkelingsachtergrond, hoewel de meeste dingen die ik heb geschreven voor het Windows-platform zijn geweest.
U kunt de eerste twee handleidingen bekijken door een bezoek te brengen aan:
- Beginnersgids voor BASH - Hello World
- Beginnersgids voor BASH - Inputparameters
Als u nog niet bekend bent met BASH-scripting, raad ik u aan de eerste twee handleidingen te lezen voordat u verdergaat met deze.
In deze handleiding zal ik benadrukken hoe ik voorwaardelijke uitspraken moet gebruiken om gebruikersinvoer te testen en om te bepalen hoe een script functioneert.
Installeer rsstail
Om deze handleiding te volgen, moet u een opdrachtregelapp installeren genaamd rsstail die wordt gebruikt om RSS-feeds te lezen.
Als u een distributietype gebruikt dat is gebaseerd op Debian / Ubuntu / Mint, doet u het volgende:
sudo apt-get install rsstail
Voor Fedora / CentOS etc typt u het volgende:
yum installeer rsstail
Voor openSUSE type het volgende:
zypper installeer rsstail
De IF-verklaring
Open een terminal en maak een bestand met de naam rssget.sh door het volgende te typen:
sudo nano rssget.sh
Voer in de nano-editor de volgende tekst in:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Sla het bestand op door op CTRL en O te drukken en verlaat het bestand door op CTRL en X te drukken.
Voer het script uit door het volgende te typen:
sh rssget.sh
Het script retourneert een lijst met titels van de linux.about.com RSS-feed.
Het is geen overdreven handig script omdat het alleen de titels van één RSS-feed haalt, maar het bespaart het pad naar de Linux.about.com RSS-feed niet.
Open het rssget.sh-script opnieuw in nano en bewerk het bestand om er als volgt uit te zien:
#! / Bin / bash
als $ 1 = "uitgebreide"dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Voer het script opnieuw uit door het volgende te typen:
sh rssget.sh uitgebreid
Deze keer komt de RSS-feed terug met de titel, link en beschrijving.
Laten we het script in een beetje detail analyseren:
De #! / Bin / bash verschijnt in elk script dat we schrijven. De volgende regel kijkt in feite naar de eerste invoerparameter die door de gebruiker wordt verschaft en vergelijkt deze met het woord "verbose". Als de invoerparameter en het woord "breedsprakig" overeenkomen met de regels ertussen dan en fi zijn gerend.
Het bovenstaande script is duidelijk gebrekkig. Wat gebeurt er als u helemaal geen invoerparameter opgeeft? Het antwoord is dat u een fout krijgt in de trant van een onverwachte operator.
De andere grote fout is dat als je het woord "uitgebreid" niet opgeeft, er helemaal niets gebeurt. In het ideale geval als u het woord uitgebreid niet opgeeft, retourneert het script een lijst met titels.
Gebruik nano opnieuw om het rssget.sh bestand te bewerken en wijzig de code als volgt:
#! / Bin / bash
als $ 1 = "uitgebreide"dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Sla het bestand op en voer het uit door het volgende te typen:
sh rssget.sh uitgebreid
Er verschijnt een lijst met titels, beschrijvingen en links. Voer het nu opnieuw uit als volgt:
sh rssget.sh titels
Deze keer verschijnt alleen een lijst met titels.
Het extra deel van het script bevindt zich op regel 4 en introduceert de anders uitspraak. In principe zegt het script nu dat als de eerste parameter het woord "verbose" is, u de beschrijving, koppelingen en titels voor de RSS-feed krijgt, maar als de eerste parameter iets anders is, moet u gewoon een lijst met titels ophalen.
Het script is enigszins verbeterd maar heeft nog steeds gebreken. Als u geen parameter invoert, krijgt u nog steeds een foutmelding. Zelfs als je een parameter opgeeft, wil alleen maar zeggen dat je niet wilt dat breedspraketten betekenen niet dat je alleen titels wilt. Je hebt misschien net een verkeerd spel verkeerd gespeld of je hebt duiven getypt wat natuurlijk nietszeggend is.
Voordat we deze problemen proberen op te lossen, wil ik je nog een opdracht laten zien die bij de IF-verklaring past.
Bewerk je rssget.sh-script om er als volgt uit te zien:
#! / Bin / bash
als $ 1 = "alle"dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "description"dan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Ik besloot om het woord uitgebreid uit de weg te ruimen en het met alles te vervangen. Dat is niet het belangrijke deel. Het bovenstaande script introduceert elif wat een korte manier is om ELSE IF te zeggen.
Nu werkt het script als volgt. Als je rent sh rssget.sh allemaal dan krijg je beschrijvingen, links en titels. Als je in plaats daarvan gewoon loopt sh rssget.sh beschrijvingje krijgt alleen titels en beschrijvingen. Als u een ander woord opgeeft, krijgt u een lijst met titels.
Dit introduceert een manier om snel een lijst met voorwaardelijke uitspraken te verzinnen. Een alternatieve manier om ELIF te doen, is door gebruik te maken van zogenaamde IF-statements.
Het volgende is een voorbeeld dat laat zien hoe geneste IF-statements werken:
#! / Bin / bash
als $ 2 = "aboutdotcom"dan als $ 1 = "alle" dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fianders als $ 1 = "alle" dan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dan rsstail -d -u http://lxer.com/module/newswire/headlines.rss anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Voel je vrij om alles in te typen als je het leuk vindt of kopieer het en plak het in je rssget.sh bestand.
Het bovenstaande script introduceert een tweede parameter waarmee u "about.com" of "lxer.com" en een RSS-feed kunt kiezen.
Om het uit te voeren typt u het volgende:
sh rssget.sh alles overdotcom
of
sh rssget.sh all lxer
Je kunt natuurlijk alles vervangen door beschrijvingen of titels om alleen beschrijvingen of titels te geven.
In principe staat in de bovenstaande code of de tweede parameter aboutdotcom is en kijk dan naar de tweede if-instructie die dezelfde is van het vorige script anders als de tweede parameter lxer is, kijk dan opnieuw naar de inner if-verklaring om te besluiten of titels, beschrijvingen worden weergegeven of zo.
Dat script is puur als een voorbeeld van een geneste ALS-instructie en er zijn zoveel dingen mis met dat script dat er nog een artikel voor nodig is om alles uit te leggen. Het belangrijkste probleem is dat het niet schaalbaar is.
Stel je voor dat je nog een RSS-feed wilde toevoegen, zoals Everyday Linux User of Linux Today? Het script zou enorm worden en als je zou besluiten dat je de innerlijke IF-statement wilt veranderen, moet je deze op meerdere plaatsen wijzigen.
Hoewel er een tijd en plaats is voor een geneste IF, moeten ze spaarzaam worden gebruikt. Er is meestal een manier om uw code te refactoren, zodat u de geneste IF helemaal niet nodig hebt. Ik zal in een volgend artikel op dit onderwerp ingaan.
Laten we nu kijken naar het probleem van mensen die duff-parameters invoeren. Bijvoorbeeld in het bovenstaande script als de gebruiker iets anders dan "aboutdotcom" als de tweede parameter invoert, verschijnt er een lijst met artikelen uit de RSS-feed van LXER, ongeacht of de gebruiker lxer invoert of niet.
Als de gebruiker bovendien niet "alles" of "beschrijving" als eerste parameter invoert, is de standaard een lijst met titels die al dan niet zijn wat de gebruiker bedoelde.
Bekijk het volgende script (of kopieer en plak het in uw rssget.sh bestand.
#! / Bin / bash
als $ 2 = "aboutdotcom" || $ 2 = "lxer"dan als $ 1 = "alle" || $ 1 = "omschrijving" || $ 1 = "titel" dan als $ 2 = "aboutdotcom" dan als $ 1 = "alle" dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi anders als $ 1 = "alle" dan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dan rsstail -d -u http://lxer.com/module/newswire/headlines.rss anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Het eerste wat opvalt is dat het script nu behoorlijk groot wordt en je snel kunt zien hoe uit de hand gerangschikt IF-statements kunnen worden.
Het bit dat belangrijk is in dit script is de IF-statement || statement DAN sectie op regel 2 en regel 4.
De || staat voor OR. Dus de lijnals $ 2 = "aboutdotcom" || $ 2 = "lxer"controleert of de 2e parameter gelijk is aan "aboutdotcom" of "lxer". Als dit niet zo is, is de IF-instructie voltooid omdat er geen is anders verklaring voor de buitenste meesten ALS.
Op dezelfde manier op regel 4 de regel als $ 1 = "alle" || $ 1 = "omschrijving" || $ 1 = "titel"controleert of de 1e parameter gelijk is aan "alle" of "beschrijving" of "titel".
Nu als de gebruiker wordt uitgevoerdsh rssget.sh aardappelskaaser wordt niets geretourneerd terwijl ze eerder een lijst met titels van LXER zouden hebben ontvangen.
Het tegenovergestelde van || is &&. De && operator staat voor AND.
Ik ga het script er nog meer als een nachtmerrie laten uitzien, maar het maakt de hele belangrijke controle om te zorgen dat de gebruiker 2 parameters heeft opgegeven.
#! / Bin / bash
als $ # -eq 2dan
als $ 2 = "aboutdotcom" || $ 2 = "lxer" dan als $ 1 = "alle" || $ 1 = "omschrijving" || $ 1 = "titel" dan als $ 2 = "aboutdotcom" dan als $ 1 = "alle" dan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi anders als $ 1 = "alle" dan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dan rsstail -d -u http://lxer.com/module/newswire/headlines.rss anders rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Het enige bit dat extra is in dat script is een andere externe IF-statement als volgt:als $ # -eq 2. Als u het artikel over invoerparameters leest, weet u dat $ # een telling van het aantal invoerparameters retourneert. De -eq staat voor gelijken. De IF-statement controleert daarom of de gebruiker 2 parameters heeft ingevoerd en als deze niet zijn voltooid, wordt deze gewoon afgesloten zonder iets te doen. (Niet bijzonder vriendelijk).
Ik ben me ervan bewust dat deze tutorial behoorlijk groot wordt. Deze week is er niet veel meer, maar ik wil helpen het script op te ruimen voordat we klaar zijn.
Het enige laatste commando dat je moet leren over voorwaardelijke uitspraken is de CASE-verklaring.
#! / Bin / bash
als $ # -eq 2dan geval $ 2 in aboutdotcom) zaak $ 1 in allemaal) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; Omschrijving) 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) zaak $ 1 in allemaal) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; Omschrijving) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titel) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
De case-statement is een leukere manier om te schrijven ALS ANDERS ALS ANDERS ALS ANDERS ALS. Bijvoorbeeld deze logica ALS fruit = bananenDan ditANDERS ALS fruit = sinaasappelenDan ditANDERS ALS fruit = druivenDan ditSTOP ALS kan worden herschreven als: hoesje fruit binnen bananen) doe dit ;; sinaasappels) doe dit ;; druiven) doe dit ;;esac In feite is het eerste item na de zaak het ding dat u gaat vergelijken (dat wil zeggen fruit). Dan is elk item vóór de haakjes het ding waarmee u vergelijkt en of het overeenkomt met de voorgaande regels; zal worden uitgevoerd. Een case-statement wordt beëindigd met de reverse esac (wat het geval is achterwaarts). In het rssget.sh script verwijdert de case-statement een deel van dat vreselijke nesten, hoewel het niet echt genoeg verbetert. Om het script echt te verbeteren, moet ik je laten kennismaken met variabelen. Kijk naar de volgende code: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"weergave = ""url = "" als $ # -lt 2 || $ # -gt 2dan echo "gebruik: rssget.sh alles | beschrijving | titel aboutdotcom | lxer"; Uitgang;fi zaak $ 1 in allemaal) display = "- d -l -u" ;; Omschrijving) display = "- d -u" ;; titel) weergave = "- u" ;;esac geval $ 2 in aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ geeft $ url weer; Een variabele wordt gedefinieerd door deze een naam te geven en er vervolgens een waarde aan toe te wijzen. In het bovenstaande voorbeeld zijn de variabelen-toewijzingen: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"weergave = ""url = "" Het script is direct beter beheersbaar door variabelen te gebruiken. Elke parameter wordt bijvoorbeeld afzonderlijk afgehandeld en er zijn dus geen geneste IF-instructies. De schermvariabele is nu ingesteld afhankelijk van of u alles hebt gekozen, beschrijving of titel en de urlvariabele is ingesteld op de waarde van de variabele aboutdotcom of de waarde van de variabele lxer, afhankelijk van of u koos voor overdotcom of lxer. Het RSSTail-commando hoeft nu alleen maar de waarde van het display en de URL te gebruiken om correct te werken. Terwijl variabelen worden ingesteld door ze gewoon een naam te geven, moet je ze gebruiken om een $ -teken voor ze te plaatsen. Met andere woorden: variable = value stelt variabele in op een waarde, terwijl $ variable means mij de inhoud van de variabele geeft. Het volgende is het laatste script voor deze zelfstudie. #! / 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"usage = "gebruik: rssget.sh all | description | title lxer | aboutdotcom | everydaylinuxuser | linuxtoday"weergave = ""url = "" als $ # -lt 2 || $ # -gt 2dan echo $ gebruik; Uitgang;fi zaak $ 1 in allemaal) display = "- d -l -u" ;; Omschrijving) display = "- d -u" ;; titel) weergave = "- u" ;; *) echo $ gebruik; Uitgang; ;;esac geval $ 2 in aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ gebruik; Uitgang;esac rsstail $ geeft $ url weer; Het bovenstaande script introduceert meer RSS-feeds en er is een gebruiksvariabele die de gebruiker vertelt hoe het script moet worden gebruikt als ze geen 2 variabelen invoeren of als ze onjuiste opties voor de variabelen invoeren. Dit is een episch artikel en is misschien te snel te ver gegaan. In de volgende gids zal ik u alle vergelijkingsopties voor IF-statements laten zien en er valt nog veel meer te zeggen over variabelen. Er is ook meer dat kan worden gedaan om het bovenstaande script te verbeteren en dit zal worden behandeld in toekomstige handleidingen bij het verkennen van loops, grep en reguliere expressies. Bekijk de sectie How To (naar beneden bladeren door de categorieën om een lijst met artikelen te bekijken) van linux.about.com om meer bruikbare handleidingen te vinden van dual booting Windows en Ubuntu tot het instellen van een virtuele machine met GNOME-boxen. Samenvatting