Introduktion
Välkommen till den tredje delen av "Beginners Guide To BASH". Om du har missat de föregående två artiklarna så kommer du noga att vilja veta vad som gör denna guide annorlunda än andra BASH-skriptguider.
Denna guide skrivs av en komplett nybörjare till BASH och så som läsare lär du dig som jag lär dig. Medan jag är nybörjare till BASH kommer jag från en mjukvaruutvecklingsbakgrund, även om de flesta saker jag skrivit har varit för Windows-plattformen.
Du kan se de två första guiderna genom att besöka:
- Nybörjare Guide till BASH - Hej World
- Nybörjarhandbok till BASH-ingångsparametrar
Om du är ny på BASH-skript rekommenderar jag att du läser de två första guiderna innan du fortsätter med den här.
I den här guiden kommer jag att lyfta fram hur man använder villkorade uttalanden för att testa användarinmatning och för att kontrollera hur ett skript fungerar.
Installera rsstail
För att följa den här guiden måste du installera en kommandoradsapplikation som heter rsstail som används för att läsa RSS-flöden.
Om du använder en Debian / Ubuntu / Mint-baserad distributionstyp, följer följande:
sudo apt-get install rsstail
För Fedora / CentOS etc skriver du följande:
Du installerar rsstail
För openSUSE skriver du följande:
zypper installera rsstail
IF-uttalandet
Öppna en terminal och skapa en fil som heter rssget.sh genom att skriva följande:
sudo nano rssget.sh
Inom nano-redigeraren anger du följande text:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Spara filen genom att trycka på CTRL och O och avsluta sedan genom att trycka på CTRL och X.
Kör manuset genom att skriva följande:
sh rssget.sh
Skriptet kommer att returnera en lista med titlar från linux.about.com RSS-flödet.
Det är inte ett alltför användbart skript eftersom det bara hämtar titlarna från ett RSS-flöde men det sparar att behöva komma ihåg sökvägen till Linux.about.com RSS-flöde.
Öppna rssget.sh-skriptet i nano igen och rediger filen så att den ser ut som följer:
#! / Bin / bash
om $ 1 = "verbose"sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Kör skriptet igen genom att skriva följande:
sh rssget.sh verbose
Den här gången kommer RSS-flödet tillbaka med titeln, länken och beskrivningen.
Låt oss analysera manuset i lite detalj:
#! / Bin / bash visas i varje script vi skriver. Nästa rad tittar i grunden på den första ingångsparametern som användaren tillhandahåller och jämför den med ordet "verbose". Om ingångsparametern och ordet "verbose" matchar linjerna mellan sedan och fi är sprang.
Ovanstående skript är uppenbarligen felaktigt. Vad händer om du inte ger en ingångsparameter alls? Svaret är att du får ett fel i linje med oväntad operatör.
Den andra stora fel är att om du inte ger ordet "verbose" så händer ingenting alls. Ideellt om du inte tillhandahåller ordet verbose skulle skriptet returnera en lista med titlar.
Använd nano igen för att redigera filen rssget.sh och ändra koden på följande sätt:
#! / Bin / bash
om $ 1 = "verbose"sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Spara filen och kör den genom att skriva följande:
sh rssget.sh verbose
En lista med titlar, beskrivningar och länkar visas. Kör nu igen på följande sätt:
sh rssget.sh titlar
Den här gången visas en lista med titlar.
Den extra delen av manuset är på rad 4 och introducerar annan påstående. I grunden säger scriptet nu om den första parametern är ordet "verbose" få beskrivningen, länkarna och titlarna för RSS-flödet, men om den första parametern är allt annat bara få en lista med titlar.
Skriptet har förbättrats något men är fortfarande felaktigt. Om du misslyckas med att ange en parameter får du fortfarande ett fel. Även om du anger en parameter, betyder det bara att du inte vill ha en ordentlig mening, men du vill bara ha titlar. Du har kanske bara stavat verbalt fel till exempel, eller du kan ha skrivit duvor som naturligtvis är meningslösa.
Innan vi försöker rensa dessa problem vill jag visa dig ett nytt kommando som går med IF-uttalandet.
Redigera ditt rssget.sh-skript för att se på följande sätt:
#! / Bin / bash
om $ 1 = "alla"sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "beskrivning"sedan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Jag bestämde mig för att bli av med verbose och ersätta den med alla. Det är inte den viktiga delen. Skriptet ovan introducerar elif vilket är ett kort sätt att säga ELSE IF.
Nu fungerar skriptet enligt följande. Om du kör sh rssget.sh allt då får du beskrivningar, länkar och titlar. Om du istället bara kör sh rssget.sh beskrivningdu får bara titlar och beskrivningar. Om du ger något annat ord får du en lista med titlar.
Detta introducerar ett sätt att snabbt komma fram till en lista över villkorliga uttalanden. Ett alternativt sätt att göra ELIF är att använda det som kallas nestade IF-uttalanden.
Nedan följer ett exempel på hur nestade IF-uttalanden fungerar:
#! / Bin / bash
om $ 2 = "omdotcom"sedan om $ 1 = "alla" sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivning" sedan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fiannan om $ 1 = "alla" sedan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivning" sedan rsstail -d -u http://lxer.com/module/newswire/headlines.rss annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Skriv gärna alla in om du vill eller kopiera och klistra in den i din rssget.sh-fil.
Ovanstående skript introducerar en andra parameter som låter dig välja antingen "about.com" eller "lxer.com" ett RSS-flöde.
För att köra det skriver du in följande:
sh rssget.sh all aboutdotcom
eller
sk rssget.sh alla lxer
Du kan naturligtvis ersätta alla med beskrivningar eller titlar för att ge bara beskrivningar eller bara titlar.
I grund och botten anger koden ovan om den andra parametern är omdotcom och titta sedan på den andra om det är samma som det föregående skriptet annars om den andra parametern är lxer, titta på det inre if-satsen igen för att bestämma om titlar, beskrivningar ska visas eller allting.
Det skriptet tillhandahålls rent som ett exempel på ett kapslat IF-uttalande och det finns så många saker som är felaktiga med det skriptet, det skulle ta en annan artikel för att förklara dem alla. Huvudfrågan är att den inte är skalbar.
Tänk dig att du ville lägga till ett annat RSS-flöde som Everyday Linux-användare eller Linux idag? Skriptet skulle bli enormt och om du bestämde dig för att du ville att det inre IF-uttalandet skulle förändras skulle du behöva ändra det på flera ställen.
Även om det finns en tid och plats för en kapslad IF, bör de användas sparsamt. Det finns vanligtvis ett sätt att refactor din kod så att du inte behöver den nestade IF alls. Jag kommer att komma vidare till detta ämne i en framtida artikel.
Låt oss nu se på att lösa problemet med personer som går in i duffparametrar. Till exempel i skriptet ovan om användaren går in på något annat än "omdotcom" som den andra parametern visas en lista med artiklar från RSS-flödet från LXER oavsett om användaren anger lxer eller inte.
Dessutom om användaren inte anger "alla" eller "beskrivning" som 1: a parametern är standardmenyn en lista med titlar som kan eller inte vara vad användaren avser.
Titta på följande skript (eller kopiera och klistra in det i din rssget.sh-fil.
#! / Bin / bash
om $ 2 = "aboutdotcom" || $ 2 = "lxer"sedan om $ 1 = "alla" || $ 1 = "beskrivning" || $ 1 = "title" sedan om $ 2 = "omdotcom" sedan om $ 1 = "alla" sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivning" sedan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi annan om $ 1 = "alla" sedan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivning" sedan rsstail -d -u http://lxer.com/module/newswire/headlines.rss annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Det första att notera är att manuset nu blir ganska stort och du kan snabbt se hur uteslutna IF-uttalanden kan bli.
Den bit som är viktig i detta skript är IF-uttalandet || uttalande THEN avsnitt på rad 2 och rad 4.
|| står för OR. Så linjenom $ 2 = "aboutdotcom" || $ 2 = "lxer"kontrollerar om den andra parametern är lika med "aboutdotcom" eller "lxer". Om det inte är så är IF-uttalandet fullständigt eftersom det inte finns något annan uttalande för det yttersta OM.
På linje 4 på linjen om $ 1 = "alla" || $ 1 = "beskrivning" || $ 1 = "title"kontrollerar om den första parametern är lika med antingen "alla" eller "beskrivning" eller "titel".
Nu om användaren körsh rssget.sh potatis ostingenting återlämnas, men innan de skulle ha fått en lista med titlar från LXER.
Det motsatta av || är &&. Operatören && står för AND.
Jag ska göra skriptet ser ännu mer ut som en mardröm men det gör all viktig kontroll för att säkerställa att användaren har tillhandahållit 2 parametrar.
#! / Bin / bash
om $ # -eq 2sedan
om $ 2 = "aboutdotcom" || $ 2 = "lxer" sedan om $ 1 = "alla" || $ 1 = "beskrivning" || $ 1 = "title" sedan om $ 2 = "omdotcom" sedan om $ 1 = "alla" sedan rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "beskrivning" sedan rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi annan om $ 1 = "alla" sedan rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "beskrivning" sedan rsstail -d -u http://lxer.com/module/newswire/headlines.rss annan rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Den enda bit som är extra i det scriptet är ett annat yttre IF-uttalande enligt följande:om $ # -eq 2. Om du läser artikeln om inmatningsparametrar vet du att $ # returnerar ett tal av antalet ingångsparametrar. -Qq står för lika. IF-uttalandet kontrollerar därför att användaren har skrivit in två parametrar och om de inte bara gick ut utan att göra någonting. (Inte särskilt vänlig).
Jag är medveten om att denna handledning blir ganska stor. Det finns inte mycket mer att täcka den här veckan men jag vill hjälpa till att städa upp manuset innan vi avslutar.
Det sista kommandot som du behöver lära dig om villkorliga uttalanden är CASE-satsen.
#! / Bin / bash
om $ # -eq 2sedan faller $ 2 i aboutdotcom) faller $ 1 in Allt) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; beskrivning) 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) faller $ 1 in Allt) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; beskrivning) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titel) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Fallet är ett trevligare sätt att skriva om ELLER ELSE ELLER OM ELLER OM. Till exempel denna logik IF frukt = bananerSedan det härANNAN OM frukt = apelsinerSedan det härANNAN OM frukt = druvorSedan det härSLUT IF kan omskrivas som: fallfrukt i bananer) gör det här ;; apelsiner) gör det här ;; druvor) gör det här ;;esac I grund och botten är det första objektet efter ärendet det du ska jämföra (dvs frukt). Då är varje föremål före parentesen den sak du jämför mot och om den matchar de föregående linjerna; kommer att springas. Ett fallutlåtande avslutas med omvänd esac (vilket är fallet bakåt). I rssget.sh-skriptet avlägsnar saken uttalandet en del av den hemska nestningen, men det förbättrar inte den nog. För att verkligen förbättra skriptet behöver jag presentera dig för variabler. Titta på följande kod: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" om $ # -lt 2 || $ # -gt 2sedan echo "användning: rssget.sh all | description | title aboutdotcom | lxer"; utgång;fi faller $ 1 in Allt) display = "- d -l -u" ;; beskrivning) display = "- d -u" ;; titel) display = "- u" ;;esac faller $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url; En variabel definieras genom att ge den ett namn och tilldela ett värde till det. I ovanstående exempel är följande variabler uppdrag: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" Skriptet är omedelbart hanterbart genom att använda variabler. Till exempel hanteras varje parameter separat och så finns det inga nätade IF-uttalanden. Displayvariabeln är nu inställd beroende på om du valde alla, beskrivning eller titel och variabeln url är inställd på värdet på omdotcom-variabeln eller värdet på lxer-variabeln beroende på om du valde omdotcom eller lxer. Kommandot rsstail behöver nu bara använda värdet på displayen och webbadressen för att köra korrekt. Även om variabler ställs in bara genom att ge dem ett namn, att faktiskt använda dem måste du placera en $ skylt framför dem. Med andra ord variabel = värde sätter variabel till ett värde medan $ variabelmedel ger mig innehållet i variabeln. Följande är slutskriptet för denna handledning. #! / 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 = "användning: rssget.sh all | beskrivning | titel lxer | omdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" om $ # -lt 2 || $ # -gt 2sedan echo $ användning utgång;fi faller $ 1 in Allt) display = "- d -l -u" ;; beskrivning) display = "- d -u" ;; titel) display = "- u" ;; *) echo $ användning utgång; ;;esac faller $ 2 i aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ användning utgång;esac rsstail $ display $ url; Ovanstående skript introducerar fler RSS-flöden och det finns en användningsvariabel som berättar användaren hur man använder manuset om de antingen inte anger 2 variabler eller de anger felaktiga alternativ för variablerna. Detta har varit en episk artikel och kan ha gått för långt för tidigt. I nästa guide kommer jag att visa dig alla jämförelsemöjligheter för IF-uttalanden och det finns fortfarande mycket mer att tala om med avseende på variabler. Det finns också fler som kan göras för att förbättra ovanstående script och detta kommer att täckas i framtida guider när vi utforskar loopar, grep och reguljära uttryck. Ta reda på hur du (Scrolla ner förbi kategorierna för att se en lista över artiklar) avsnittet linux.about.com för att hitta mer användbara guider från dubbla uppstart av Windows och Ubuntu för att ställa in en virtuell maskin med GNOME-lådor. Sammanfattning