Einführung
Willkommen zum dritten Teil des "Beginners Guide to BASH". Wenn Sie die beiden letzten Artikel verpasst haben, möchten Sie wahrscheinlich wissen, warum sich dieses Handbuch von anderen BASH-Skripthandbüchern unterscheidet.
Dieser Leitfaden wird von einem kompletten BASH-Anfänger geschrieben und so lernen Sie als Leser, während ich lerne. Während ich ein Anfänger von BASH bin, komme ich aus einem Softwareentwicklungs-Hintergrund, obwohl das meiste, was ich geschrieben habe, für die Windows-Plattform war.
Die ersten beiden Führer können Sie unter folgendem Link sehen:
- Anfängerleitfaden für BASH - Hello World
- Anfängerleitfaden für BASH - Eingabeparameter
Wenn Sie mit BASH-Scripting noch nicht vertraut sind, empfiehlt es sich, die ersten beiden Anleitungen zu lesen, bevor Sie mit diesem fortfahren.
In diesem Handbuch werde ich hervorheben, wie Sie mit Bedingungsanweisungen Benutzereingaben testen und steuern können, wie ein Skript funktioniert.
Installieren Sie rsstail
Um dieser Anleitung folgen zu können, müssen Sie eine Befehlszeilenanwendung namens rsstail installieren, die zum Lesen von RSS-Feeds verwendet wird.
Wenn Sie eine auf Debian / Ubuntu / Mint basierende Verteilung verwenden, geben Sie Folgendes ein:
sudo apt-get install rsstail
Für Fedora / CentOS usw. geben Sie Folgendes ein:
yum install rsstail
Für openSUSE geben Sie Folgendes ein:
Zypper installieren rsstail
Die IF-Anweisung
Öffnen Sie ein Terminal und erstellen Sie eine Datei mit dem Namen rssget.sh, indem Sie Folgendes eingeben:
sudo nano rssget.sh
Geben Sie im Nano-Editor den folgenden Text ein:
#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Speichern Sie die Datei, indem Sie STRG und O drücken, und beenden Sie sie, indem Sie STRG und X drücken.
Führen Sie das Skript aus, indem Sie Folgendes eingeben:
sh rssget.sh
Das Skript gibt eine Liste der Titel aus dem RSS-Feed linux.about.com zurück.
Es ist kein übermäßig nützliches Skript, da es nur die Titel aus einem RSS-Feed abruft, es muss jedoch nicht an den Pfad zum Linux.about.com-RSS-Feed erinnert werden.
Öffnen Sie das Skript rssget.sh erneut in nano und bearbeiten Sie die Datei wie folgt:
#! / bin / bash
if $ 1 = "verbose"dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Führen Sie das Skript erneut aus, indem Sie Folgendes eingeben:
sh rssget.sh verbose
Diesmal kommt der RSS-Feed mit Titel, Link und Beschreibung zurück.
Lassen Sie uns das Skript etwas detaillierter analysieren:
Das #! / Bin / bash erscheint in jedem Skript, das wir schreiben. Die nächste Zeile betrachtet im Wesentlichen den ersten vom Benutzer bereitgestellten Eingabeparameter und vergleicht ihn mit dem Wort "verbose". Wenn der Eingabeparameter und das Wort "verbose" mit den Zeilen dazwischen übereinstimmen dann und fi sind ran.
Das obige Skript ist offensichtlich fehlerhaft. Was passiert, wenn Sie überhaupt keinen Eingabeparameter angeben? Die Antwort ist, Sie erhalten einen Fehler im Sinne eines unerwarteten Operators.
Der andere große Fehler ist, dass nichts passiert, wenn Sie das Wort "verbose" nicht angeben. Wenn Sie das Wort nicht ausführlich angeben, gibt das Skript im Idealfall eine Liste mit Titeln zurück.
Verwenden Sie nano erneut, um die Datei rssget.sh zu bearbeiten, und ändern Sie den Code wie folgt:
#! / bin / bash
if $ 1 = "verbose"dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Speichern Sie die Datei und führen Sie sie aus, indem Sie Folgendes eingeben:
sh rssget.sh verbose
Eine Liste mit Titeln, Beschreibungen und Links wird angezeigt. Führen Sie es jetzt erneut wie folgt aus:
sh rssget.sh Titel
Diesmal erscheint nur eine Liste von Titeln.
Der zusätzliche Teil des Skripts befindet sich in Zeile 4 und führt die sonst Aussage. Grundsätzlich sagt das Skript nun, wenn der erste Parameter das Wort "verbose" ist, die Beschreibung, Links und Titel für den RSS-Feed abrufen. Wenn der erste Parameter jedoch etwas anderes ist, erhalten Sie einfach eine Liste mit Titeln.
Das Skript hat sich etwas verbessert, ist aber immer noch fehlerhaft. Wenn Sie keinen Parameter eingeben, wird immer noch ein Fehler angezeigt. Selbst wenn Sie einen Parameter angeben, bedeutet dies nicht nur, dass Sie nur Titel wünschen. Möglicherweise haben Sie beispielsweise nur wortwörtlich falsch geschrieben oder Sie haben Tauben eingegeben, was natürlich bedeutungslos ist.
Bevor wir versuchen, diese Probleme zu beheben, möchte ich Ihnen noch einen Befehl zeigen, der zur IF-Anweisung gehört.
Bearbeiten Sie Ihr Skript rssget.sh so, dass es wie folgt aussieht:
#! / bin / bash
if $ 1 = "all"dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "description"dann rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Ich entschied mich, das Wort wortreich zu entfernen und es durch alle zu ersetzen. Das ist nicht der wichtige Teil. Das obige Skript führt ein elif Das ist eine kurze Art, ELSE IF zu sagen.
Das Skript funktioniert nun wie folgt. Wenn du läufst sh rssget.sh alle Dann erhalten Sie Beschreibungen, Links und Titel. Wenn du stattdessen einfach rennst Sch rssget.sh beschreibungSie erhalten nur Titel und Beschreibungen. Wenn Sie ein anderes Wort angeben, erhalten Sie eine Liste mit Titeln.
Auf diese Weise können Sie schnell eine Liste von Bedingungsanweisungen erstellen. Eine alternative Methode für ELIF ist die Verwendung von sogenannten verschachtelten IF-Anweisungen.
Das folgende Beispiel zeigt, wie geschachtelte IF-Anweisungen funktionieren:
#! / bin / bash
wenn $ 2 = "aboutdotcom"dann if $ 1 = "all" dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dann rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fisonst if $ 1 = "all" dann rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dann rsstail -d -u http://lxer.com/module/newswire/headlines.rss sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Fühlen Sie sich frei, all das einzugeben, wenn Sie möchten, oder kopieren Sie es und fügen Sie es in Ihre rssget.sh-Datei ein.
Das obige Skript führt einen zweiten Parameter ein, mit dem Sie entweder "about.com" oder "lxer.com" als RSS-Feed auswählen können.
Um es auszuführen, geben Sie Folgendes ein:
sh rssget.sh alles über Dotcom
oder
sh rssget.sh alle lxer
Sie können natürlich alle durch Beschreibungen oder Titel ersetzen, um nur Beschreibungen oder Titel bereitzustellen.
Grundsätzlich sagt der obige Code, wenn der zweite Parameter aboutdotcom ist, und dann die zweite if -Anweisung, die die gleiche ist wie im vorherigen Skript. Andernfalls, wenn der zweite Parameter lxer ist, dann die innere if -Anweisung erneut, um zu entscheiden, ob Titel und Beschreibungen angezeigt werden sollen oder alles.
Dieses Skript dient lediglich als Beispiel für eine verschachtelte IF-Anweisung, und es gibt so viele Dinge, die mit diesem Skript falsch sind, dass ein anderer Artikel sie erklären müsste. Das Hauptproblem ist, dass es nicht skalierbar ist.
Stellen Sie sich vor, Sie wollten einen weiteren RSS-Feed hinzufügen, z. B. Everyday Linux User oder Linux Today? Das Skript würde umfangreich werden, und wenn Sie sich entschieden haben, die innere IF-Anweisung zu ändern, müssten Sie es an mehreren Stellen ändern.
Es gibt zwar Zeit und Ort für eine verschachtelte IF, sie sollten jedoch sparsam verwendet werden. Normalerweise gibt es eine Möglichkeit, Ihren Code so umzuformen, dass Sie die verschachtelte IF überhaupt nicht benötigen. Ich werde in einem zukünftigen Artikel auf dieses Thema eingehen.
Sehen wir uns nun das Problem der Personen an, die Duff-Parameter eingeben. Wenn der Benutzer beispielsweise im zweiten Skript etwas anderes als "aboutdotcom" als zweiten Parameter eingibt, wird eine Liste von Artikeln aus dem RSS-Feed von LXER angezeigt, unabhängig davon, ob der Benutzer lxer eingibt oder nicht.
Wenn der Benutzer nicht "all" oder "description" als ersten Parameter eingibt, ist der Standardwert eine Liste von Titeln, die der Benutzer möglicherweise beabsichtigt oder nicht.
Sehen Sie sich das folgende Skript an (oder kopieren Sie es und fügen Sie es in Ihre Datei rssget.sh ein.)
#! / bin / bash
wenn $ 2 = "aboutdotcom" || $ 2 = "lxer"dann wenn $ 1 = "alle" || $ 1 = "Beschreibung" || $ 1 = "title" dann wenn $ 2 = "aboutdotcom" dann if $ 1 = "all" dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dann rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi sonst if $ 1 = "all" dann rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dann rsstail -d -u http://lxer.com/module/newswire/headlines.rss sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Das erste, was zu beachten ist, ist, dass das Skript jetzt ziemlich groß wird und Sie schnell sehen können, wie verschachtelte IF-Anweisungen außer Kontrolle geraten können.
Das in diesem Skript wichtige Bit ist die IF-Anweisung || Anweisung THEN Abschnitt in Zeile 2 und Zeile 4.
Die || steht für ODER. Also die Liniewenn $ 2 = "aboutdotcom" || $ 2 = "lxer"prüft, ob der 2. Parameter gleich "aboutdotcom" oder "lxer" ist. Wenn dies nicht der Fall ist, ist die IF-Anweisung vollständig, da es keine gibt sonst Aussage für das Äußerste OB.
Ebenso in Zeile 4 die Zeile wenn $ 1 = "alle" || $ 1 = "Beschreibung" || $ 1 = "title"prüft, ob der 1. Parameter entweder "all" oder "description" oder "title" entspricht.
Nun wenn der Benutzer läuftsh rssget.sh Kartoffeln KäseEs wird nichts zurückgegeben, obwohl sie zuvor eine Liste mit Titeln von LXER erhalten hätten.
Das Gegenteil von || ist &&. Der Operator && steht für AND.
Ich werde das Skript noch mehr wie einen Albtraum aussehen lassen, aber es ist die allerwichtigste Prüfung, um sicherzustellen, dass der Benutzer 2 Parameter angegeben hat.
#! / bin / bash
wenn $ # -eq 2dann
wenn $ 2 = "aboutdotcom" || $ 2 = "lxer" dann wenn $ 1 = "alle" || $ 1 = "Beschreibung" || $ 1 = "title" dann wenn $ 2 = "aboutdotcom" dann if $ 1 = "all" dann rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" dann rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi sonst if $ 1 = "all" dann rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" dann rsstail -d -u http://lxer.com/module/newswire/headlines.rss sonst rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Das einzige zusätzliche Bit in diesem Skript ist eine weitere äußere IF-Anweisung:wenn $ # -eq 2. Wenn Sie den Artikel über Eingabeparameter lesen, werden Sie wissen, dass $ # die Anzahl der Eingabeparameter zurückgibt. Der -eq steht für gleich. Die IF-Anweisung überprüft daher, ob der Benutzer 2 Parameter eingegeben hat. Wenn dies nicht der Fall ist, wird er ohne etwas beendet. (Nicht besonders freundlich).
Ich bin mir bewusst, dass dieses Tutorial ziemlich umfangreich wird. Diese Woche gibt es nicht mehr viel zu berichten, aber ich möchte helfen, das Skript aufzuräumen, bevor wir fertig sind.
Der letzte Befehl, den Sie über Bedingungsanweisungen benötigen, ist die CASE-Anweisung.
#! / bin / bash
wenn $ # -eq 2dann Fall $ 2 in aboutdotcom) Fall $ 1 in alles) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; Beschreibung) 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) Fall $ 1 in alles) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; Beschreibung) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; Titel) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Die Case-Anweisung ist eine schönere Art, IF ELSE IF ELSE IF ELSE IF zu schreiben. Zum Beispiel diese Logik WENN Obst = BananenDann dasELSE IF Frucht = OrangenDann dasELSE WENN Obst = TraubenDann dasENDE WENN kann umgeschrieben werden als: Fall Obst in Bananen) mach das ;; Orangen) mach das ;; Trauben) mach das ;;esac Im Grunde ist das erste Element nach dem Fall das, was Sie vergleichen werden (d. H. Obst). Dann ist jedes Element vor den Klammern das, mit dem Sie vergleichen, und wenn es mit den vorangegangenen Zeilen übereinstimmt ;; wird ausgeführt. Eine Fallaussage wird mit dem umgekehrten Esac (der Fall rückwärts) beendet. Im Skript rssget.sh entfernt die case-Anweisung einige dieser schrecklichen Verschachtelungen, die jedoch nicht wirklich verbessert werden. Um das Skript wirklich zu verbessern, muss ich Sie mit Variablen vertraut machen. Schauen Sie sich den folgenden Code an: #! / bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"Anzeige = ""URL = "" wenn $ # -lt 2 || $ # -gt 2dann echo "usage: rssget.sh all | description | title aboutdotcom | lxer"; Ausfahrt;fi Fall $ 1 in alles) Anzeige = "- d -l -u" ;; Beschreibung) Anzeige = "- d -u" ;; Titel) Anzeige = "- u" ;;esac Fall $ 2 in aboutdotcom) URL = $ aboutdotcom; ;; lxer) URL = $ lxer; ;;esacrsstail $ display $ url; Eine Variable wird definiert, indem Sie ihr einen Namen geben und ihr dann einen Wert zuweisen. Im obigen Beispiel sind die folgenden Variablenzuweisungen: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"Anzeige = ""URL = "" Das Skript ist durch die Verwendung von Variablen sofort überschaubar. Zum Beispiel wird jeder Parameter separat behandelt, sodass es keine verschachtelten IF-Anweisungen gibt. Die Anzeigevariable wird jetzt abhängig davon festgelegt, ob Sie alle, description oder title ausgewählt haben, und die URL-Variable wird auf den Wert der Variable aboutdotcom oder auf den Wert der Variable lxer festgelegt, je nachdem, ob Sie aboutdotcom oder lxer auswählen. Der Befehl rsstail muss jetzt nur den Wert von display und url verwenden, um ordnungsgemäß ausgeführt zu werden. Während Variablen nur durch Angabe eines Namens festgelegt werden, müssen Sie zur Verwendung dieser Zeichen ein $ -Zeichen vor ihnen setzen. Mit anderen Worten: Variable = Wert setzt Variable auf einen Wert, während $ Variable den Inhalt der Variablen angibt. Im Folgenden finden Sie das letzte Skript für dieses Lernprogramm. #! / 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 = "usage: rssget.sh all | description | title lxer | aboutdotcom | everydaylinuxuser | linuxtoday"Anzeige = ""URL = "" wenn $ # -lt 2 || $ # -gt 2dann echo $ use; Ausfahrt;fi Fall $ 1 in alles) Anzeige = "- d -l -u" ;; Beschreibung) Anzeige = "- d -u" ;; Titel) Anzeige = "- u" ;; *) echo $ use; Ausfahrt; ;;esac Fall $ 2 in aboutdotcom) URL = $ aboutdotcom; ;; lxer) URL = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; dailylinuxuser) URL = $ everydaylinuxuser; ;; *) echo $ use; Ausfahrt;esac rsstail $ display $ url; Das obige Skript führt weitere RSS-Feeds ein, und es gibt eine Verwendungsvariable, die den Benutzer darüber informiert, wie das Skript verwendet werden soll, wenn entweder keine zwei Variablen oder falsche Optionen für die Variablen eingegeben werden. Dies war ein epischer Artikel und möglicherweise zu früh gegangen. In der nächsten Anleitung werde ich Ihnen alle Vergleichsmöglichkeiten für IF-Anweisungen zeigen. In Bezug auf Variablen gibt es noch viel mehr zu besprechen. Es gibt auch noch mehr Möglichkeiten, um das obige Skript zu verbessern. Dies wird in zukünftigen Leitfäden beschrieben, wenn wir Schleifen, Grep und reguläre Ausdrücke untersuchen. Lesen Sie den Abschnitt How to (Blättern Sie nach unten zu den Kategorien, um eine Liste der Artikel anzuzeigen) von linux.about.com. Dort finden Sie weitere nützliche Anleitungen zum dualen Booten von Windows und Ubuntu zum Einrichten einer virtuellen Maschine mit GNOME-Boxen. Zusammenfassung