
Hallo habrozhiteli! Der internationale Bestseller „Linux Command Line“ hilft Ihnen dabei, den Weg von den ersten schüchternen Klicks auf die Tasten zu überwinden, um sicher vollständige Programme für die neueste Version von bash zu erstellen - die beliebteste Linux-Shell. In der zweiten Ausgabe werden neue Funktionen in Bash 4.x beschrieben, z. B. neue Umleitungsoperatoren und Platzhalteroperationen. Sie lernen die zeitlosen Befehlszeilenfähigkeiten kennen: Navigieren im Dateisystem, Einrichten der Umgebung, Verketten von Befehlen und Abgleichen mit regulären Ausdrücken. Sie werden die Philosophie hinter vielen Befehlszeilentools verstehen, das umfangreiche Erbe von Unix-Supercomputern verstehen und das Wissen kennenlernen, das Generationen von Gurus gesammelt haben, die die Maus aus ihrem Arsenal an Tools ausgeschlossen haben. Nachdem Sie den ersten „Shell-Schock“ überwunden haben, werden Sie verstehen, wie natürlich und logisch diese Art der Interaktion mit einem Computer ist.
Auszug. Kapitel 25. Projektbeginn
In diesem Kapitel beginnen wir mit der Erstellung des Programms. Das Ziel dieses Projekts ist es zu zeigen, wie Sie die verschiedenen Funktionen der Shell zum Erstellen von Programmen und vor allem zum Erstellen
guter Programme verwenden können.
Als nächstes werden wir
einen Berichtsgenerator schreiben. Es werden verschiedene Informationen über das System und seinen Status im HTML-Format angezeigt, sodass es in einem Webbrowser angezeigt werden kann.
In der Regel erfolgt die Erstellung von Programmen in mehreren Schritten, in denen jeweils neue Funktionen und Fähigkeiten hinzugefügt werden. Am Ende der ersten Phase spielt unser Programm eine minimale HTML-Seite ohne Informationen ab. Wir werden diese Informationen in den nächsten Schritten hinzufügen.
Stufe Eins: Mindestdokument
Lassen Sie uns zunächst bestimmen, wie das Format eines wohlgeformten HTML-Dokuments aussieht. Es hat die folgende Form:
<html> <head> <title> </title> </head> <body> . </body> </html>
Wenn Sie diesen Text in einen Texteditor eingeben und in einer Datei namens
foo.html speichern , können Sie ihn öffnen, indem Sie in Firefox die folgende URL
eingeben :
file: ///home/username/foo.html .
In der ersten Phase erstellen wir ein Programm, das dieses HTML-Markup in der Standardausgabe ausgibt. Das Schreiben eines solchen Programms ist sehr einfach. Öffnen Sie einen Texteditor und erstellen Sie eine Datei mit dem Namen ~ / bin / sys_info_page:
[me@linuxbox ~]$ vim ~/bin/sys_info_page
Und geben Sie dann das folgende Programm ein:
#!/bin/bash # echo "<html>" echo " <head>" echo " <title>Page Title</title>" echo " </head>" echo " <body>" echo " Page body." echo " </body>" echo "</html>"
Unsere erste Version enthält eine Shebang-Zeile, einen Kommentar (Willkommen) und eine Folge von Echo-Befehlen, einen für jede Zeilenausgabe. Machen Sie die Datei nach dem Speichern ausführbar und versuchen Sie Folgendes auszuführen:
[me@linuxbox ~]$ chmod 755 ~/bin/sys_info_page [me@linuxbox ~]$ sys_info_page
Nach dem Start sollte der Text des HTML-Dokuments auf dem Bildschirm angezeigt werden, da die Echo-Befehle im Skript ihre Zeilen an die Standardausgabe senden. Führen Sie das Programm erneut aus und leiten Sie die Ausgabe des Programms in die Datei
sys_info_page.html um, um das Ergebnis in einem Webbrowser anzuzeigen:
[me@linuxbox ~]$ sys_info_page > sys_info_page.html [me@linuxbox ~]$ firefox sys_info_page.html
So weit, so gut.
Bei der Entwicklung von Programmen sollten Sie immer an Einfachheit und Klarheit denken. Die Wartung ist einfacher, wenn das Programm leicht zu lesen und zu verstehen ist, ganz zu schweigen von der Tatsache, dass das Programm einfacher zu schreiben ist, wenn die manuelle Eingabe reduziert werden kann. Die aktuelle Version des Programms funktioniert hervorragend, kann aber vereinfacht werden. Die Kombination aller Echo-Befehle zu einem Befehl wird es in Zukunft definitiv einfacher machen, der Programmausgabe neue Zeilen hinzuzufügen. Daher ändern wir das Programm wie folgt:
#!/bin/bash # echo "<html> <head> <title>Page Title</title> </head> <body> Page body. </body> </HTML>"
In Anführungszeichen gesetzte Zeichenfolgen können Zeilenvorschübe enthalten und dementsprechend mehrere Textzeilen enthalten. Die Shell liest weiterhin Text, bis sie auf ein abschließendes Zitat stößt. Diese Regel gilt auch für die Befehlszeile:
[me@linuxbox ~]$ echo "<html> > <head> > <title>Page Title</title> > </head> > <body> > Page body. > </body> > </html>"
Das Symbol> am Anfang jeder Zeile fordert Sie auf, eine durch die PS2-Variable definierte Shell einzugeben. Es wird angezeigt, wenn eine mehrzeilige Anweisung eingegeben wird. Diese Funktion ist immer noch unklar, aber wenn wir uns mit mehrzeiligen Programmanweisungen vertraut machen, werden ihre Vorteile offensichtlich.
Schritt zwei: Fügen Sie einige Daten hinzu
Nachdem das Programm ein minimales Dokument generieren kann, fügen Sie dem Bericht einige Daten hinzu. Nehmen Sie dazu folgende Änderungen vor:
#!/bin/bash # echo "<html> <head> <title>System Information Report</title> </head> <body> <h1>System Information Report</h1> </body> </html>"
Hier werden der Name der Seite und der Titel im Hauptteil des Berichts hinzugefügt.
Variablen und Konstanten
Es gab ein Problem in unserem Skript. Haben Sie bemerkt, dass die Zeile Systeminformationsbericht zweimal wiederholt wird? Im Allgemeinen ist dies für ein so kleines Szenario kein so großes Problem, aber stellen Sie sich ein wirklich langes Szenario vor, in dem diese Zeile viele Male wiederholt wird. Wenn Sie den Namen in einem solchen Szenario ändern müssen, müssen Sie an vielen Stellen Änderungen vornehmen, und dies ist eine Menge manueller Arbeit. Ist es möglich, das Skript so zu ändern, dass die Zeichenfolge nur einmal darin definiert wird? Dies würde die Wartung des Skripts in Zukunft erheblich vereinfachen. Ja, das ist zum Beispiel so möglich:
#!/bin/bash # title="System Information Report" echo "<html> <head> <title>$title</title> </head> <body> <h1>$title</h1> </body> </html>"
Indem wir eine
Variable namens title erstellt und ihr den Wert System Information Report zugewiesen haben, haben wir die Parametersubstitution genutzt und die Zeichenfolge an vielen Stellen platziert.
Aber wie erstelle ich eine Variable? Einfach - benutze es einfach. Wenn die Shell auf eine Variable stößt, wird sie automatisch erstellt. Dies unterscheidet sich von vielen Programmiersprachen, in denen Variablen explizit deklariert oder definiert werden müssen, bevor sie verwendet werden. Die Befehlsshell ist in dieser Hinsicht zu liberal, was letztendlich zu einigen Problemen führt. Betrachten Sie beispielsweise das folgende Skript, das in der Befehlszeile ausgeführt wird:
[me@linuxbox ~]$ foo="yes" [me@linuxbox ~]$ echo $foo yes [me@linuxbox ~]$ echo $fool [me@linuxbox ~]$
Wir haben der Variablen foo zuerst den Wert yes zugewiesen und dann ihren Wert mit dem Befehl echo ausgegeben. Als nächstes haben wir erneut versucht, den Wert der Variablen anzuzeigen, aber durch Angabe des Namens Narren einen Tippfehler gemacht, und wir haben eine leere Zeichenfolge erhalten. Dieses Ergebnis wird durch die Tatsache erklärt, dass die Shell die Narrenvariable beim Auftreten erfolgreich erstellt und ihr einen leeren Standardwert zugewiesen hat. Aus diesem Beispiel folgt, dass Sie die Rechtschreibung sorgfältig überwachen müssen! Es ist auch wichtig zu verstehen, was in diesem Beispiel tatsächlich passiert ist. Aus der vorherigen Kenntnis der Merkmale des Substitutionsmechanismus wissen wir, dass das Team
[me@linuxbox ~]$ echo $foo
ist dem Mechanismus der Parametersubstitution ausgesetzt, wodurch er die Form annimmt
[me@linuxbox ~]$ echo yes
Auf der anderen Seite das Team
[me@linuxbox ~]$ echo $fool
verwandelt sich in
[me@linuxbox ~]$ echo
Eine leere Variable wird durch nichts ersetzt! Dies kann zu Fehlern in Befehlen führen, für die Argumente erforderlich sind. Zum Beispiel:
[me@linuxbox ~]$ foo=foo.txt [me@linuxbox ~]$ foo1=foo1.txt [me@linuxbox ~]$ cp $foo $fool cp: 'foo.txt' , "cp --help" .
Wir haben zwei Variablen Werte zugewiesen, foo und foo1. Und dann haben sie versucht, den Befehl cp auszuführen, aber sie haben im Namen des zweiten Arguments einen Tippfehler gemacht. Nach der Verarbeitung durch die Suchmaschine erhielt der Befehl cp nur ein Argument, obwohl zwei erforderlich sind.
Im Folgenden sind einige Regeln für die Benennung von Variablen aufgeführt:
- Variablennamen können aus alphanumerischen Zeichen (Buchstaben und Zahlen) und Unterstrichen bestehen.
- Das erste Zeichen in einem Variablennamen kann nur ein Buchstabe oder ein Unterstrich sein.
- Das Vorhandensein von Leerzeichen und Satzzeichen in Variablennamen ist nicht zulässig.
Die
Namensvariable bedeutet einen Wert, der sich ändern kann, und in vielen Anwendungen werden Variablen auf diese Weise verwendet. Die Titelvariable in unserer Anwendung wird jedoch als
Konstante verwendet . Eine Konstante hat wie eine Variable einen Namen und enthält einen Wert. Der einzige Unterschied besteht darin, dass sich der Wert der Konstante nicht ändert. In einer Anwendung, die geometrische Berechnungen durchführt, können Sie eine PI-Konstante mit einem Wert von 3,1415 definieren, anstatt diese Zahl im gesamten Programm zu verwenden. Die Shell unterscheidet nicht zwischen Konstanten und Variablen. Diese Begriffe werden hauptsächlich zur Vereinfachung für den Programmierer verwendet. Eine typische Konvention besteht darin, Großbuchstaben zu verwenden, um Konstanten und Kleinbuchstaben für echte Variablen anzugeben. Lassen Sie uns das Szenario ändern, um es mit dieser Konvention in Einklang zu bringen:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> </body> </html>"
Unterwegs haben wir den Namen ergänzt, indem wir am Ende den Wert der Shell-Variablen HOSTNAME hinzugefügt haben. Dies ist der Netzwerkname des Computers.
HINWEIS
Tatsächlich verfügt die Shell über einen Mechanismus, der die Unveränderlichkeit von Konstanten in Form eines integrierten Deklarationsbefehls mit dem Parameter -r (schreibgeschützt - schreibgeschützt) garantiert. Wenn Sie der TITLE-Variablen einen Wert zuweisen, wie unten gezeigt:
declare -r TITLE="Page Title"
In der Shell kann der Wert nicht erneut der Variablen TITLE zugewiesen werden. Dieser Mechanismus wird in der Praxis selten verwendet, ist jedoch verfügbar und kann in besonders strengen Szenarien verwendet werden.
Variablen und Konstanten Werte zuweisen
Wir sind zu dem Zeitpunkt gekommen, an dem unser Wissen über die Funktionsweise des Substitutionsmechanismus Früchte zu tragen beginnt. Wie wir gesehen haben, erfolgt die Zuweisung von Werten zu Variablen folgendermaßen:
=
Dabei ist die
Variable der Name der Variablen und der
Wert die Zeichenfolge. Im Gegensatz zu einigen anderen Programmiersprachen kümmert sich die Shell nicht um die Arten von Werten, die Variablen zugewiesen sind. Sie interpretiert alle Werte als Zeichenfolgen. Es ist möglich, die Shell zu zwingen, den Bereich der zugewiesenen Werte auf Ganzzahlen zu beschränken, indem Sie den Befehl declare mit der Option -i verwenden. Wie das Deklarieren von schreibgeschützten Variablen wird diese Funktion in der Praxis jedoch selten verwendet.
Beachten Sie, dass der Zuweisungsoperator zwischen dem Variablennamen, dem Gleichheitszeichen und dem Wert keine Leerzeichen enthält. Und woraus kann die Bedeutung bestehen? Von allem können Sie zu einer Zeichenfolge erweitern.
a=z # a "z". b="a string" # . c="a string and $b" # , # , . d=$(ls -l foo.txt) # . e=$((5 * 7)) # . f="\t\ta string\n" # , # .
In einer Zeile können Sie mehrere Variablen gleichzeitig zuweisen:
a=5 b="a string"
Bei Verwendung der Substitution können Variablennamen in optionalen geschweiften Klammern {} eingeschlossen werden. Dies ist nützlich, wenn der Variablenname im umgebenden Kontext mehrdeutig wird. Im folgenden Beispiel wird versucht,
myfile mithilfe einer Variablen in
myfile1 umzubenennen:
[me@linuxbox ~]$ filename="myfile" [me@linuxbox ~]$ touch $filename [me@linuxbox ~]$ mv $filename $filename1 mv: 'myfile' , "mv --help" .
Dieser Versuch war erfolglos, da die Shell das zweite Argument des Befehls mv als Namen einer neuen (und leeren) Variablen interpretierte. Im Folgenden wird gezeigt, wie Sie dieses Problem lösen können:
[me@linuxbox ~]$ mv $filename ${filename}1
Durch Hinzufügen von geschweiften Klammern haben wir sichergestellt, dass die Shell das letzte Zeichen 1 nicht als Teil des Variablennamens interpretiert.
Hinweis
Bei der Ersetzung wird empfohlen, die Variablennamen und Befehle in doppelte Anführungszeichen zu setzen, um zu verhindern, dass die Shell Zeilen in Wörter zerlegt. Es ist besonders wichtig, Anführungszeichen zu verwenden, wenn eine Variable einen Dateinamen enthalten kann.
Wir werden diese Gelegenheit nutzen, um dem Bericht zusätzliche Daten hinzuzufügen, nämlich Datum und Uhrzeit des Berichts sowie den Namen des Benutzers, der den Bericht erstellt hat:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html>"
Eingebettete Dokumente
Wir haben uns zwei verschiedene Textausgabemethoden angesehen, und beide verwenden den Befehl echo. Es gibt jedoch eine andere dritte Methode, die als
Inline-Dokument (hier Dokument) oder
Inline-Skript (hier Skript) bezeichnet wird. Ein eingebettetes Dokument ist eine zusätzliche Form der E / A-Umleitung, bei der in ein Skript eingebetteter Text an die Standardbefehlseingabe übergeben wird. Diese Umleitung funktioniert folgendermaßen:
<<
Dabei ist der
Befehl der Name des Befehls, der den angegebenen Text über die Standardeingabe empfängt, und der
Indikator ist die Zeile, die das Ende des eingebetteten Textes markiert. Wir werden das Szenario mithilfe des darin eingebetteten Dokuments ändern:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" cat << _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html> _EOF_
Anstelle des Befehls echo verwendet das Skript jetzt den Befehl cat und das eingebettete Dokument. Die Zeile _EOF_ wurde für die Indikatorrolle ausgewählt (bedeutet
Dateiende -
Dateiende , gemeinsame Vereinbarung) und markiert das Ende des eingebetteten Textes. Bitte beachten Sie, dass sich die Indikatorzeile in einer separaten Zeile befinden sollte und keine Leerzeichen darauf folgen sollten.
Aber was sind die Vorteile der Verwendung des eingebetteten Dokuments hier? Praktisch keine, außer dass die Anführungszeichen in eingebetteten Dokumenten ihre besondere Bedeutung für die Shell verlieren. Das folgende Beispiel zeigt die Verwendung eines eingebetteten Dokuments in der Befehlszeile:
[me@linuxbox ~]$ foo="some text" [me@linuxbox ~]$ cat << _EOF_ > $foo > "$foo" > '$foo' > \$foo > _EOF_ some text "some text" 'some text' $foo
Wie Sie sehen können, achtet die Befehlsshell nicht auf Anführungszeichen. Sie interpretiert sie als gewöhnliche Charaktere. Dank dessen fügen wir Anführungszeichen frei in eingebettete Dokumente ein. Dieser Umstand kann bei der Entwicklung von Berichtsprogrammen verwendet werden.
Eingebettete Dokumente können mit allen Befehlen verwendet werden, die Daten von der Standardeingabe akzeptieren. Im folgenden Beispiel wird anhand eines integrierten Dokuments eine Folge von Befehlen an das FTP-Programm gesendet, um eine Datei von einem Remote-FTP-Server herunterzuladen:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n << _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
Wenn Sie den Umleitungsoperator << durch << - ersetzen, ignoriert die Befehlsshell die anfänglichen Tabulatorzeichen im eingebetteten Dokument. Dank dessen können dem eingebetteten Dokument Einrückungen hinzugefügt werden, um die Lesbarkeit zu verbessern:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n <<- _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
Die Verwendung dieser Funktion ist jedoch nicht immer praktisch, da viele Texteditoren (und Programmierer selbst) für den Einzug Leerzeichen anstelle von Tabulatoren verwenden.
Fazit
In diesem Kapitel haben wir mit der Entwicklung eines Projekts begonnen, mit dem wir alle Phasen der Erstellung eines Skripts durchlaufen. Wir haben uns mit Variablen und Konstanten und den Merkmalen ihrer Verwendung vertraut gemacht. Sie werden häufiger als andere Softwarekomponenten zur Substitution verwendet. Wir haben auch gesehen, wie die Ausgabe von Informationen in einem Skript organisiert wird, und uns mit verschiedenen Methoden zum Einbetten von Textblöcken vertraut gemacht.
Über den Autor
William Shotts ist ein professioneller Softwareentwickler mit mehr als 30 Jahren Erfahrung, der das Linux-Betriebssystem seit mehr als 20 Jahren aktiv einsetzt. Er verfügt über umfangreiche Erfahrung in der Softwareentwicklung, im technischen Support, in der Qualitätskontrolle und beim Schreiben von Dokumentationen. Er ist auch der Schöpfer von LinuxCommand.org, einer Bildungs- und Bildungsseite für Linux, auf der Nachrichten, Rezensionen und Support über die Linux-Befehlszeile bereitgestellt werden.
Über Science Editor
Jordi Gutiérrez Hermoso ist Computerprogrammierer, Mathematiker und ethischer Hacker. Seit 2002 wird ausschließlich Debian GNU / Linux nicht nur zu Hause, sondern auch bei der Arbeit verwendet. Jordi ist an der Entwicklung von GNU Octave beteiligt, einer kostenlosen Computerumgebung, die weitgehend mit Matlab kompatibel ist, sowie von Mercurial, einem verteilten Versionskontrollsystem. Er liebt reine und angewandte Mathematik, Eislaufen, Schwimmen und Stricken. In letzter Zeit denkt er viel über die Probleme der Treibhausgasemissionen nach und beteiligt sich an Maßnahmen zur Rettung von Nashörnern.
»Weitere Informationen zum Buch finden Sie auf
der Website des Herausgebers»
Inhalt»
Auszug25% Rabatt auf Gutschein für Händler -
LinuxNach Bezahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.