Heute sprechen wir über Bash-Skripte. Dies sind , die für die Bash-Shell geschrieben sind. Es gibt auch andere Shellets, wie z. B. zsh, tcsh, ksh, aber wir konzentrieren uns auf Bash. Dieses Material ist für alle Interessierten gedacht, die einzige Voraussetzung ist, dass man mit der Linux arbeitet.
Befehlszeilenskripte sind Sammlungen derselben Befehle, die über die Tastatur eingegeben werden können, in Dateien zusammengefasst und mit einem bestimmten Ziel verbunden. Die Ergebnisse der Befehlsausführung können entweder eigenständigen Wert haben oder als Eingabedaten für andere Befehle dienen. Skripte sind eine mächtige Methode zur Automatisierung häufig ausgeführter Aktionen.
Wenn wir also über die Befehlszeile sprechen, erlaubt sie es, mehrere Befehle auf einmal auszuführen, indem man sie durch ein Semikolon trennt:
pwd ; whoami Wenn Sie dies in Ihrem Terminal ausprobiert haben, haben Sie bereits Ihr erstes Bash-Skript geschrieben, das zwei Befehle beinhaltet. Es funktioniert so. Zuerst pwd zeigt Informationen über das aktuelle Arbeitsverzeichnis an, dann whoamizeigt Informationen über den Benutzer an, mit dem Sie angemeldet sind.
Mit einem ähnlichen Ansatz können Sie beliebig viele Befehle in einer Zeile kombinieren, die einzige Einschränkung liegt in der maximalen Anzahl von Argumenten, die an ein Programm übergeben werden können. Diese Einschränkung kann mit folgendem Befehl bestimmt werden:
getconf ARG_MAXDie Befehlszeile ist ein hervorragendes Werkzeug, aber die Befehle müssen jedes Mal eingegeben werden, wenn sie benötigt werden. Was wäre, wenn wir eine Reihe von Befehlen in einer Datei speichern und diese Datei einfach zum Ausführen aufrufen würden? Diese Datei, von der wir sprechen, wird als Befehlszeilenskript bezeichnet.
Wie Bash-Skripte aufgebaut sind
Erstellen Sie eine leere Datei mit dem Befehl touch. In der ersten Zeile müssen wir angeben, welche Shell wir verwenden möchten. Uns interessiert bash, daher wird die erste Zeile der Datei folgendermaßen aussehen:
#!/bin/bash In den anderen Zeilen dieser Datei wird das Rautezeichen verwendet, um Kommentare anzuzeigen, die von der Shell ignoriert werden. Die erste Zeile ist jedoch ein besonderer Fall, hier zeigt die Raute, gefolgt von einem Ausrufezeichen (diese Sequenz nennt man ) und der Pfad zu bash, dass das Skript speziell für bash.
Shell-Befehle werden durch Zeilenumbrüche getrennt, Kommentare werden durch das Rautezeichen hervorgehoben. So sieht das aus:
#!/bin/bash
# This is a comment
pwd
whoamiHier kann man, wie in der Kommandozeile, Befehle in einer Zeile schreiben, indem man sie mit einem Semikolon trennt. Dennoch, wenn man Befehle in verschiedenen Zeilen schreibt, ist die Datei leichter lesbar. In jedem Fall wird die Shell sie verarbeiten.
Berechtigungen für die Skriptdatei festlegen
Speichern Sie die Datei unter dem Namen myscript, und die Arbeit an der Erstellung des Bash-Skripts ist fast abgeschlossen. Jetzt bleibt nur noch, diese Datei ausführbar zu machen, sonst stoßen Sie beim Versuch, sie auszuführen, auf einen Fehler Zugriff verweigert.

Versuch, die Skriptdatei mit falsch konfigurierten Berechtigungen auszuführen
Machen wir die Datei ausführbar:
chmod +x .\/myscriptJetzt versuchen wir, sie auszuführen:
.\/myscriptNach der Festlegung der Berechtigungen funktioniert alles wie gewünscht.

Erfolgreiche Ausführung des Bash-Skripts
Nachrichtenausgabe
Um Text in die Linux-Konsole auszugeben, wird der Befehl echoverwendet. Lassen Sie uns dieses Wissen nutzen und unser Skript bearbeiten, um Erklärungen zu den Daten hinzuzufügen, die die bereits vorhandenen Befehle ausgeben:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiSo wird das Ergebnis nach dem Ausführen des aktualisierten Skripts aussehen.

Nachrichtenausgabe aus dem Skript
Jetzt können wir erklärende Texte ausgeben, indem wir den Befehl echoverwenden. Wenn Sie nicht wissen, wie Sie die Datei mit Linux-Tools bearbeiten, oder wenn Sie noch nie den Befehl echo, schauen Sie sich Material.
Verwendung von Variablen
Variablen ermöglichen es, Informationen in der Skriptdatei zu speichern, beispielsweise die Ergebnisse von Befehlen zur Verwendung durch andere Befehle.
Es ist nichts Schlechtes daran, einzelne Befehle auszuführen, ohne die Ergebnisse zu speichern, aber die Möglichkeiten dieses Ansatzes sind ziemlich begrenzt.
Es gibt zwei Arten von Variablen, die in Bash-Skripten verwendet werden können:
- Umgebungsvariablen
- Benutzerdefinierte Variablen
Umgebungsvariablen
Manchmal müssen Shell-Teams mit bestimmten Systemdaten arbeiten. Hier ist beispielsweise, wie Sie das Home-Verzeichnis des aktuellen Benutzers ausgeben können:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Bitte beachten Sie, dass wir die Systemvariable $HOME in doppelten Anführungszeichen verwenden können, was die Erkennung durch das System nicht behindert. So sieht es aus, wenn Sie das oben genannte Skript ausführen.

Verwendung einer Umgebungsvariable im Skript
Was, wenn wir das Dollarzeichen auf dem Bildschirm ausgeben möchten? Lassen Sie uns Folgendes versuchen:
echo "I have $1 in my pocket" Das System wird das Dollarzeichen in der durch Anführungszeichen begrenzten Zeile erkennen und annehmen, dass wir auf eine Variable verweisen. Das Skript wird versuchen, den Wert einer undefinierten Variable auszugeben. $1Das ist nicht das, was wir brauchen. Was tun?
In einer solchen Situation hilft die Verwendung eines Steuerzeichens, des umgekehrten Schrägstrichs, vor dem Dollarzeichen:
echo "I have $1 in my pocket"Jetzt gibt das Skript genau das aus, was erwartet wird.

Verwendung einer Escape-Sequenz zur Ausgabe des Dollarzeichens
Benutzerdefinierte Variablen
Neben Umgebungsvariablen ermöglichen es bash-Skripte, eigene Variablen im Skript zu definieren und zu verwenden. Solche Variablen speichern den Wert, bis das Skript beendet wird.
Wie bei Systemvariablen können benutzerdefinierte Variablen mit dem Dollarzeichen angesprochen werden:
TNW-CUS-FMP – der Aktionscode für 10% Rabatt auf unsere Dienstleistungen, verfügbar zum Aktivieren für 7 Tage
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"So wird das Ergebnis nach dem Start eines solchen Skripts aussehen.

Benutzerdefinierte Variablen im Skript
Befehlsersetzung
Eine der nützlichsten Funktionen von bash-Skripten ist die Möglichkeit, Informationen aus der Ausgabe von Befehlen zu extrahieren und sie Variablen zuzuweisen, was es ermöglicht, diese Informationen überall im Skript zu verwenden.
Dies kann auf zwei Arten erfolgen.
- Mit dem umgekehrten Akzentzeichen „`“
- Mit der Konstruktion
$()
Beim ersten Ansatz achten Sie darauf, dass Sie nicht anstelle des umgekehrten Akzentzeichens ein einfaches Anführungszeichen eingeben. Der Befehl muss in zwei solchen Zeichen eingeschlossen werden:
mydir=`pwd`Bei der zweiten Methode wird dasselbe folgendermaßen geschrieben:
mydir=$(pwd)Das Skript könnte letztendlich so aussehen:
#!/bin/bash
mydir=$(pwd)
echo $mydir Während seiner Ausführung wird die Ausgabe des Befehls pwdin der Variable mydir, deren Inhalt mit dem Befehl echo, in die Konsole gelangt.

Ein Skript, das die Ergebnisse eines Befehls in einer Variablen speichert
Mathematische Operationen
Um mathematische Operationen in einer Skriptdatei durchzuführen, kann die Konstruktion verwendet werden $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Mathematische Operationen im Skript
Steuerungskonstruktion if-then
In einigen Skripten ist es erforderlich, den Programmfluss zu steuern. Zum Beispiel, wenn ein bestimmter Wert größer als fünf ist, muss eine Handlung ausgeführt werden, andernfalls eine andere. Dies ist in vielen Situationen anwendbar, und dabei hilft uns die Steuerungskonstruktion if-then. In ihrer einfachsten Form sieht sie so aus:
if Befehl
then
Befehle
fiHier ist ein praktisches Beispiel:
#!/bin/bash
if pwd
then
echo "It works"
fi In diesem Fall, wenn die Ausführung des Befehls pwderfolgreich abgeschlossen wird, wird der Text „it works“ in die Konsole ausgegeben.
Nutzen wir das Wissen, das wir haben, und erstellen ein komplexeres Skript. Angenommen, wir müssen einen bestimmten Benutzer in /etc/passwd, und wenn wir ihn finden, ihn darüber informieren, dass er existiert.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiDas ist das Ergebnis nach dem Start dieses Skripts.

Benutzersuche
Hier haben wir den Befehl grepverwendet, um den Benutzer in der Datei /etc/passwdzu finden. Wenn der Befehl grepIhnen nicht bekannt ist, finden Sie die Beschreibung dazu .
In diesem Beispiel wird, wenn der Benutzer gefunden wird, eine entsprechende Nachricht ausgegeben. Und was passiert, wenn der Benutzer nicht gefunden wird? In diesem Fall wird das Skript einfach beendet, ohne uns etwas zu sagen. Wir möchten, dass es uns auch darüber informiert, daher werden wir den Code verbessern.
Steuerungskonstruktion if-then-else
Damit das Programm sowohl über die Ergebnisse einer erfolgreichen Suche als auch über Misserfolge informieren kann, verwenden wir die Konstruktion if-then-else. So ist sie strukturiert:
if Befehl
then
Befehle
else
Befehle
fi Wenn der erste Befehl null zurückgibt, was ein erfolgreiches Ausführen bedeutet, wird die Bedingung wahr sein und die Ausführung wird nicht in den Zweig elsegehen. Andernfalls, wenn etwas anderes als null zurückgegeben wird, was bedeutet, dass es ein Misserfolg oder ein falsches Ergebnis war, werden die Befehle ausgeführt, die nach else.
stehen.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Schreiben wir ein solches Skript: else.

Die Ausführung ging in den Zweig
Nun, fahren wir fort und stellen uns die Frage nach komplexeren Bedingungen. Was, wenn wir nicht eine, sondern mehrere Bedingungen überprüfen müssen? Zum Beispiel, wenn der gesuchte Benutzer gefunden wurde, soll eine Nachricht ausgegeben werden, wenn eine weitere Bedingung erfüllt ist – eine weitere Nachricht, und so weiter. In solchen Situationen helfen uns verschachtelte Bedingungen. Das sieht so aus:
if bedingung1
then
befehle
elif bedingung2
then
befehle
fi Wenn die erste Bedingung null zurückgibt, was auf ihre erfolgreiche Ausführung hinweist, werden die Befehle im ersten Block ausgeführt then, andernfalls, wenn die erste Bedingung falsch ist und wenn die zweite Bedingung null zurückgibt, wird der zweite Block ausgeführt.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi In einem solchen Skript können wir zum Beispiel einen neuen Benutzer mit dem Befehl erstellen useradd, wenn die Suche keine Ergebnisse geliefert hat, oder etwas anderes Nützliches tun.
Zahlenvergleich
In Skripten können numerische Werte verglichen werden. Unten ist eine Liste der entsprechenden Befehle.
n1 -eq n2Gibt einen wahren Wert zurück, wennn1gleich istn2.
n1 -ge n2Gibt einen wahren Wert zurück, wennn1größer oder gleichn2.
n1 -gt n2Gibt einen wahren Wert zurück, wennn1nicht mehrn2.
n1 -le n2Gibt einen wahren Wert zurück, wennn1kleiner oder gleichn2.
n1 -lt n2Gibt einen wahren Wert zurück, wenn n1 kleiner istn2.
n1 -ne n2Gibt einen wahren Wert zurück, wennn1ungleichn2.
Als Beispiel probieren wir einen der Vergleichsoperatoren aus. Beachten Sie, dass der Ausdruck in eckigen Klammern steht.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiDas wird dieser Befehl ausgeben.

Zahlenvergleich in Skripten
Der Wert der Variable val1größer als 5, sodass der Zweig des thenVergleichsoperators ausgeführt wird und die entsprechende Nachricht in die Konsole ausgegeben wird.
Stringvergleich
In Skripten können auch Stringwerte verglichen werden. Die Vergleichsoperatoren sind recht einfach, jedoch gibt es bestimmte Besonderheiten, auf die wir später eingehen werden. Hier ist eine Liste der Operatoren.
str1 = str2Überprüft die Gleichheit von Strings, gibt wahr zurück, wenn die Strings identisch sind.
sstr1 != str2Gibt wahr zurück, wenn die Strings nicht identisch sind.
str1 < str2Gibt wahr zurück, wennstr1weniger alsstr2.
str1 > str2Gibt wahr zurück, wennstr1größer alsstr2.
-n str1Gibt wahr zurück, wenn die Längestr1größer als null ist.
-z str1Gibt wahr zurück, wenn die Längestr1gleich null.
Hier ist ein Beispiel für den Stringvergleich in einem Skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiAls Ergebnis der Ausführung des Skripts erhalten wir Folgendes.

Stringvergleich in Skripten
Hier ist ein besonderes Merkmal beim Vergleichen von Zeichenfolgen, das erwähnt werden sollte. Nämlich müssen die Operatoren „>“ und „“ als Befehl zur Umleitung der Ausgabe.
So sieht die Arbeit mit diesen Operatoren im Code aus:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiHier sind die Ergebnisse der Skriptausführung.

Zeichenfolgenvergleich, Warnung ausgegeben
Beachten Sie, dass das Skript zwar ausgeführt wird, aber eine Warnung ausgibt:
. /myscript: Zeile 5: [: zu viele Argumente Um diese Warnung loszuwerden, setzen wir $val2 in doppelte Anführungszeichen:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiJetzt funktioniert alles wie es soll.

Stringvergleich
Ein weiteres Merkmal der Operatoren „>“ und „<“ betrifft, wie sie mit Groß- und Kleinbuchstaben arbeiten. Um dieses Merkmal zu verstehen, erstellen wir eine Textdatei mit folgendem Inhalt:
Likegeeks
likegeeks Wir speichern sie unter dem Namen myfile, und führen dann den folgenden Befehl im Terminal aus:
sort myfileEs wird die Zeilen aus der Datei folgendermaßen sortiert:
likegeeks
Likegeeks Team sortieren, sortiert standardmäßig die Zeilen aufsteigend, das heißt, der Kleinbuchstabe in unserem Beispiel ist kleiner als der Großbuchstabe. Jetzt bereiten wir ein Skript vor, das die gleichen Zeichenfolgen vergleicht:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiWenn es ausgeführt wird, stellt sich heraus, dass es genau umgekehrt ist - der Kleinbuchstabe ist nun größer als der Großbuchstabe.

Der sort-Befehl und der Vergleich von Zeichenfolgen im Skript
Bei Vergleichsbefehlen sind Großbuchstaben kleiner als Kleinbuchstaben. Der Vergleich von Zeichenfolgen erfolgt hier durch den Vergleich der ASCII-Codes der Zeichen, wobei die Reihenfolge der Sortierung somit von den Zeichencodes abhängt.
Team sortieren, wiederum nutzt die Sortierreihenfolge, die in den Systemeinstellungen der Sprache festgelegt ist.
Dateiprüfungen
Vielleicht werden die folgenden Befehle in bash-Skripten am häufigsten verwendet. Sie ermöglichen es, verschiedene Bedingungen hinsichtlich von Dateien zu überprüfen. Hier ist eine Liste dieser Befehle.
-d fileÜberprüft, ob die Datei existiert und ob sie ein Verzeichnis ist.
-e fileÜberprüft, ob die Datei existiert.
-f fileÜberprüft, ob die Datei existiert und ob es sich um eine Datei handelt.
-r fileÜberprüft, ob die Datei existiert und ob sie lesbar ist.
-s fileÜberprüft, ob die Datei existiert und ob sie nicht leer ist.
-w fileÜberprüft, ob die Datei existiert und ob sie beschreibbar ist.
-x fileÜberprüft, ob die Datei existiert und ob sie ausführbar ist.
file1 -nt file2Überprüft, ob neuer alsfile1, alsfile2.
file1 -ot file2Überprüft, ob älter alsfile1, alsfile2.
-O DateiÜberprüft, ob die Datei existiert und ob der aktuelle Benutzer der Eigentümer ist.
-G DateiÜberprüft, ob die Datei existiert und ob ihre Gruppen-ID mit der Gruppen-ID des aktuellen Benutzers übereinstimmt.
Diese Befehle und viele andere, die heute behandelt wurden, sind leicht zu merken. Ihre Namen, die aus verschiedenen Wörtern abgekürzt sind, weisen direkt auf die durchgeführten Überprüfungen hin.
Lassen Sie uns einen der Befehle in der Praxis ausprobieren:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiDieses Skript zeigt den Inhalt des vorhandenen Verzeichnisses an.

Ausgabe des Verzeichnisinhalts
Wir gehen davon aus, dass Sie mit den anderen Befehlen selbst experimentieren können; alle funktionieren nach dem gleichen Prinzip.
Ergebnisse
Heute haben wir darüber gesprochen, wie man mit dem Schreiben von Bash-Skripten beginnt, und einige Grundlagen behandelt. Tatsächlich ist das Thema Bash-Programmierung riesig. Dieser Artikel ist eine Übersetzung des ersten Teils einer großen Serie von 11 Materialien. Wenn Sie jetzt weitermachen möchten, finden Sie hier die Liste der Originale dieser Materialien. Zur Bequemlichkeit haben wir auch den eingearbeitet, den Sie gerade gelesen haben.
- — hier geht es darum, wie man mit dem Erstellen von Bash-Skripten beginnt, die Verwendung von Variablen wird behandelt, bedingte Strukturen, Berechnungen, Vergleiche von Zahlen und Zeichenfolgen sowie das Abrufen von Informationen über Dateien.
- — hier werden die Besonderheiten der Arbeit mit for- und while-Schleifen behandelt.
- — dieses Material behandelt die Befehlszeilenparameter und -schlüssel, die an Skripte übergeben werden können, die Verarbeitung von Daten, die vom Benutzer eingegeben werden, und von Dateien gelesen werden können.
- — hier geht es um Dateideskriptoren und die Arbeit mit ihnen, um Eingabeströme, Ausgaben und Fehler, sowie um die Weiterleitung von Ausgaben.
- — dieses Material behandelt Linux-Signale, deren Verarbeitung in Skripten und die Ausführung von Skripten nach Zeitplan.
- — hier erfahren Sie, wie man Funktionen in Skripten erstellt und verwendet sowie Bibliotheken entwickelt.
- — dieser Artikel beschäftigt sich mit dem Arbeiten mit dem Stream-Text-Editor sed.
- — dieses Material befasst sich mit der Programmierung in der Datenverarbeitungsprache awk.
- — hier können Sie über die Verwendung von regulären Ausdrücken in Bash-Skripten lesen.
- — hier finden Sie Techniken zur Arbeit mit Nachrichten, die an Benutzer gesendet werden können, sowie Methoden zur Festplattenüberwachung.
- — dieses Material widmet sich dem Expect-Tool, mit dem die Interaktion mit interaktiven Tools automatisiert werden kann. Insbesondere wird hier über Expect-Skripte und deren Interaktion mit Bash-Skripten und anderen Programmen gesprochen.
Wir glauben, dass eine der wertvollsten Eigenschaften dieser Reihe von Artikeln darin besteht, dass sie, beginnend mit den einfachsten Inhalten, die für Benutzer jedes Niveaus geeignet sind, allmählich zu ziemlich ernsten Themen führt und allen Interessierten die Möglichkeit gibt, sich beim Erstellen von Linux-Befehlszeilenskripten weiterzuentwickeln.
Liebe Leser! Wir bitten die Gurus der Bash-Programmierung, uns zu erzählen, wie sie die Höhen des Fachwissens erreicht haben, ihre Geheimnisse zu teilen, während wir von denen, die gerade ihr erstes Skript geschrieben haben, gerne Eindrücke erwarten.
Nur registrierte Benutzer können an der Umfrage teilnehmen. .
Sollen die restlichen Teile des Artikels übersetzt werden?
Ja!
Nein, das ist nicht notwendig
1030 Benutzer haben abgestimmt. 106 Benutzer haben sich enthalten.
Quelle: habr.com
