Heute sprechen wir über Bash-Skripte. Dies sind , die für die Bash-Shell geschrieben wurden. Es gibt auch andere Shells wie zsh, tcsh, ksh, aber wir konzentrieren uns auf Bash. Dieses Material richtet sich an alle Interessierten, die einzige Voraussetzung ist, dass Sie in der Linux arbeiten können.
Shell-Skripte sind eine Sammlung derselben Befehle, die Sie über die Tastatur eingeben können, in Dateien organisiert und zu einem gemeinsamen Ziel zusammengeführt. Die Ergebnisse dieser Befehle können entweder eigenständig wertvoll sein oder als Eingabedaten für andere Befehle dienen. Skripte sind eine leistungsstarke Methode zur Automatisierung häufig durchgeführter Aufgaben.
Die Befehlszeile ermöglicht es Ihnen, mehrere Befehle auf einmal auszuführen, indem Sie sie durch ein Semikolon trennen:
pwd ; whoami Wenn Sie dies in Ihrem Terminal ausprobiert haben, haben Sie bereits Ihr erstes Bash-Skript geschrieben, das zwei Befehle enthält. Es funktioniert so: Zuerst gibt der Befehl pwd die Informationen über das aktuelle Arbeitsverzeichnis aus, dann der Befehl whoamizeigt die Daten über den Benutzer an, mit dem Sie angemeldet sind.
Mit diesem Ansatz können Sie beliebig viele Befehle in einer Zeile kombinieren; die einzige Einschränkung ist die maximale Anzahl der Argumente, die an ein Programm übergeben werden können. Dieses Limit kann mit folgendem Befehl ermittelt werden:
getconf ARG_MAXDie Kommandozeile ist ein hervorragendes Werkzeug, aber die Befehle müssen jedes Mal eingegeben werden, wenn sie benötigt werden. Was wäre, wenn wir eine Gruppe von Befehlen in einer Datei speichern und diese Datei einfach zur Ausführung aufrufen könnten? Diese Datei nennen wir ein Skript der Kommandozeile.
Wie Bash-Skripte aufgebaut sind
Erstellen Sie eine leere Datei mit folgendem Befehl touch. In der ersten Zeile müssen wir angeben, welche Shell wir verwenden möchten. Wir interessieren uns für bash, daher wird die erste Zeile der Datei so aussehen:
#!/bin/bash In den weiteren Zeilen dieser Datei wird das Rautezeichen verwendet, um Kommentare zu kennzeichnen, die von der Shell ignoriert werden. Die erste Zeile ist jedoch ein Sonderfall, hier kommt die Raute gefolgt von einem Ausrufezeichen vor (diese Sequenz wird als ) und der Pfad zu bash, was dem System zeigt, dass das Skript genau für bash.
Die Shell-Befehle werden durch Zeilenumbrüche getrennt, Kommentare werden mit dem Rautezeichen hervorgehoben. So sieht das aus:
#!/bin/bash
# This is a comment
pwd
whoamiHier können, genau wie in der Kommandozeile, Befehle in einer Zeile geschrieben werden, indem man sie mit einem Semikolon trennt. Wenn Sie jedoch die Befehle auf verschiedenen Zeilen schreiben, wird die Datei leichter lesbar. So oder so wird die Shell sie verarbeiten.
Berechtigungen für die Skriptdatei festlegen
Speichern Sie die Datei unter dem Namen myscript, und die Erstellung des Bash-Skripts ist fast abgeschlossen. Jetzt müssen wir nur noch die Datei ausführbar machen, sonst erhalten Sie beim Versuch, sie auszuführen, eine Fehlernachricht. Zugriff verweigert.

Versuch, die Skriptdatei mit falschen Berechtigungen auszuführen
Machen wir die Datei ausführbar:
chmod +x ./myscriptJetzt versuchen wir, sie auszuführen:
./myscriptNachdem die Berechtigungen festgelegt wurden, funktioniert alles wie vorgesehen.

Erfolgreiche Ausführung des Bash-Skripts
Nachrichtenausgabe
Für die Ausgabe von Text in die Linux-Konsole wird der Befehl echoverwendet. Nutzen wir dieses Wissen und bearbeitete unser Skript, indem wir Erklärungen zu den Daten hinzufügen, die bereits von den vorhandenen Befehlen ausgegeben werden:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiSo wird es nach dem Ausführen des aktualisierten Skripts aussehen.

Nachrichtenausgabe aus dem Skript
Jetzt können wir erklärende Texte ausgeben, indem wir den Befehl verwenden. echo. Wenn Sie nicht wissen, wie Sie eine Datei mit Linux-Tools bearbeiten können oder noch nie mit dem Befehl konfrontiert wurden, echo, werfen Sie einen Blick auf das Material.
Verwendung von Variablen
Variablen ermöglichen es, Informationen in einem Skript zu speichern, wie zum Beispiel Ergebnisse von Befehlen zur weiteren Verwendung durch andere Befehle.
Es ist nichts Falsches daran, einzelne Befehle auszuführen, ohne die Ergebnisse zu speichern, aber die Möglichkeiten dieses Ansatzes sind sehr begrenzt.
Es gibt zwei Arten von Variablen, die in Bash-Skripten verwendet werden können:
- Umgebungsvariablen
- Benutzervariablen
Umgebungsvariablen
Manchmal muss man in der Shell mit bestimmten Systemdaten arbeiten. Hier ist beispielsweise, wie Sie das Heimatverzeichnis des aktuellen Benutzers ausgeben können:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Beachten Sie, dass wir die Systemvariable $HOME in doppelten Anführungszeichen verwenden können, ohne dass das System sie nicht erkennt. So wird das Ergebnis aussehen, wenn Sie das obige Skript ausführen.

Verwendung der Umgebungsvariable im Skript
Und wenn wir das Dollarzeichen auf den Bildschirm ausgeben müssen? Probieren wir es so:
echo "Ich habe $1 in meiner Tasche" Das System erkennt das Dollarzeichen in einer von Anführungszeichen umschlossenen Zeichenkette und interpretiert es als Verweis auf eine Variable. Das Skript wird versuchen, den Wert einer undefinierten Variablen auf dem Bildschirm auszugeben. $1Das ist nicht, was wir brauchen. Was sollten wir tun?
In einer solchen Situation kann der Einsatz eines Steuerzeichens, eines umgekehrten Schrägstrichs vor dem Dollarzeichen, helfen:
echo "Ich habe $1 in meiner Tasche"Jetzt gibt das Skript genau das aus, was erwartet wird.

Verwendung einer Escape-Sequenz zur Ausgabe des Dollarzeichens
Benutzervariablen
Neben Umgebungsvariablen erlauben Bash-Skripte, eigene Variablen zu definieren und im Skript zu verwenden. Solche Variablen behalten ihren Wert, bis die Ausführung des Skripts abgeschlossen ist.
Wie bei den Systemvariablen können die benutzerdefinierten Variablen mit dem Dollarzeichen angesprochen werden:
TNW-CUS-FMP — der Promo-Code für einen 10% Rabatt auf unsere Dienstleistungen ist innerhalb von 7 Tagen aktivierbar.
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"So sieht das Ergebnis nach der Ausführung eines solchen Skripts aus.

Benutzerdefinierte Variablen im Skript
Befehlsersetzung
Eine der nützlichsten Funktionen von Bash-Skripten ist die Fähigkeit, Informationen aus der Ausgabe von Befehlen zu extrahieren und diesen Variablen zuzuweisen. Dadurch kann man diese Informationen überall im Skript verwenden.
Es gibt zwei Möglichkeiten, dies zu tun.
- Mit dem rückwärtigen Apostroph-Symbol „`“
- Mit der Konstruktion
$()
Im ersten Ansatz achten Sie darauf, dass Sie statt des rückwärtigen Apostrophs kein einfaches Anführungszeichen verwenden. Der Befehl muss in zwei solcher Zeichen eingeschlossen werden:
mydir=`pwd`Beim zweiten Ansatz wird das Gleiche so geschrieben:
mydir=$(pwd)Das Skript könnte schließlich so aussehen:
#!/bin/bash
mydir=$(pwd)
echo $mydir Während seiner Ausführung wird die Ausgabe des Befehls pwdin der Variable mydirgespeichert, deren Inhalt mit dem Befehl echoin die Konsole geleitet wird.

Ein Skript, das die Ergebnisse der Ausführung eines Befehls in einer Variablen speichert
Mathematische Operationen
Um mathematische Operationen im Skript auszuführen, kann man eine Konstruktion dieser Art verwenden: $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Mathematische Operationen im Skript
Die Kontrollstruktur if-then
In einigen Szenarien ist es notwendig, den Fluss von Befehlen zu steuern. Zum Beispiel, wenn ein Wert größer als fünf ist, muss eine bestimmte Aktion ausgeführt werden, andernfalls eine andere. Dies ist in vielen Situationen relevant, und hier hilft uns eine Steueranweisung. if-then. In der 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 im Konsole der Text „it works“ ausgegeben.
Lassen Sie uns das Wissen, das wir haben, nutzen und ein komplexeres Szenario schreiben. Angenommen, wir müssen einen bestimmten Benutzer in /etc/passwd, finden, und wenn wir ihn finden, informieren, dass er existiert.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiDas ergibt sich nach dem Ausführen dieses Skripts.

Benutzersuche
Hier haben wir den Befehl grepverwendet, um den Benutzer in der Datei /etc/passwdzu suchen. Wenn der Befehl grepunbekannt ist, kann die Beschreibung dafür gefunden werden. .
In diesem Beispiel wird das Skript eine entsprechende Nachricht ausgeben, wenn der Benutzer gefunden wird. Was aber, wenn der Benutzer nicht gefunden werden kann? In diesem Fall würde das Skript einfach die Ausführung beenden, ohne uns etwas mitzuteilen. Wir möchten, dass es uns auch darüber informiert, also verbessern wir den Code.
Die Steuerkonstruktion if-then-else
Um der Anwendung zu ermöglichen, sowohl über erfolgreiche als auch über fehlgeschlagene Suchen zu informieren, verwenden wir die Konstruktion if-then-else. So ist sie aufgebaut:
if Befehl
then
Befehle
else
Befehle
fi Wenn der erste Befehl null zurückgibt, was bedeutet, dass er erfolgreich ausgeführt wurde, wird die Bedingung wahr und die Ausführung geht nicht den Zweig else. Andernfalls, wenn etwas zurückgegeben wird, das von null abweicht, was einen Fehler oder ein falsches Ergebnis anzeigen würde, werden die nachfolgenden Befehle ausgeführt. else.
Lass uns ein solches Skript schreiben:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Seine Ausführung ging den Zweig else.

Das Skript wird mit der Konstruktion if-then-else gestartet.
Lass uns weitermachen und uns die Frage nach komplizierteren Bedingungen stellen. Was ist, wenn wir nicht nur eine Bedingung, sondern mehrere überprüfen müssen? Zum Beispiel, wenn der gewünschte Benutzer gefunden wurde, sollen wir eine Nachricht ausgeben; wenn eine weitere Bedingung erfüllt ist, dann eine andere Nachricht und so weiter. In so einer Situation helfen uns verschachtelte Bedingungen. Das sieht so aus:
if Befehl1
then
Befehle
elif Befehl2
then
Befehle
fi Wenn der erste Befehl null zurückgibt, was auf seine erfolgreiche Ausführung hinweist, werden die Befehle im ersten Block ausgeführt. then, andernfalls, wenn die erste Bedingung falsch ist und der zweite Befehl null zurückgibt, wird der zweite Codeblock 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 kann man beispielsweise einen neuen Benutzer mit dem Befehl useradderstellen, wenn die Suche keine Ergebnisse liefert, oder etwas anderes Nützliches tun.
Zahlenvergleiche
In Skripten kann man numerische Werte vergleichen. Nachfolgend finden Sie eine Liste der entsprechenden Befehle.
n1 -eq n2Gibt wahr zurück, wennn1gleichn2.
n1 -ge n2Gibt wahr zurück, wennn1größer oder gleichn2.
n1 -gt n2Gibt wahr zurück, wennn1mehrn2.
n1 -le n2Gibt wahr zurück, wennn1kleiner oder gleichn2.
n1 -lt n2Gibt wahr zurück, wenn n1 kleiner ist alsn2.
n1 -ne n2Gibt wahr zurück, wennn1ungleichn2.
Als Beispiel testen wir einen der Vergleichsoperatoren. Beachten Sie, dass der Ausdruck in eckige Klammern eingeschlossen ist.
#!/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 diese Kommandozeile ausgeben.

Zahlenvergleiche in Skripten
Der Wert der Variablen val1ist größer als 5, daher wird der Branch ausgeführt thendes Vergleichsoperators und eine entsprechende Nachricht wird in die Konsole ausgegeben.
Stringvergleiche
In Skripten können auch String-Werte verglichen werden. Die Vergleichsoperatoren sehen recht einfach aus, jedoch gibt es bestimmte Besonderheiten, die wir im Folgenden ansprechen werden. Hier ist die Liste der Operatoren.
str1 = str2Überprüft, ob die Strings gleich sind, gibt Wahr zurück, wenn die Strings identisch sind.
str1 != str2Gibt Wahr zurück, wenn die Strings nicht identisch sind.
str1 < str2Gibt Wahr zurück, wennstr1kleiner ist 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ängestr1ist gleich null.
Hier ist ein Beispiel für den Vergleich von Strings in einem Skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiDas Ergebnis der Ausführung des Skripts ist das Folgende.

Stringvergleiche in Skripten
Eine wichtige Eigenschaft beim Vergleich von Zeichenfolgen ist, dass 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 des Skripts.

Vergleich von Zeichenfolgen, Warnung ausgegeben
Bitte beachten Sie, dass der Skript, obwohl er ausgeführt wird, eine Warnung ausgibt:
./myscript: Zeile 5: [: zu viele Argumente Um diese Warnung zu vermeiden, 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 gewünscht.

Stringvergleiche
Eine weitere Besonderheit der Operatoren „>“ und „<“ besteht darin, wie sie mit Zeichen in Groß- und Kleinschreibung arbeiten. Um diese Eigenschaft zu verstehen, erstellen wir eine Textdatei mit folgendem Inhalt:
Likegeeks
likegeeks Wir speichern sie unter dem Namen myfile, danach führen wir im Terminal den folgenden Befehl aus:
sort myfileSie wird die Zeilen aus der Datei so sortieren:
likegeeks
Likegeeks Der Befehl sortieren, standardmäßig sortiert die Reihenfolge aufsteigend, das heißt, der Kleinbuchstabe in unserem Beispiel ist kleiner als der Großbuchstabe. Jetzt bereiten wir ein Skript vor, das dieselben Zeichenfolgen vergleichen wird:
#!/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 alles umgekehrt ist – der Kleinbuchstabe ist jetzt größer als der Großbuchstabe.

Der Befehl sortieren und der Vergleich von Zeichenfolgen im Skript
Bei den Vergleichsbefehlen sind Großbuchstaben kleiner als Kleinbuchstaben. Der Vergleich der Zeichenfolgen erfolgt hier durch den Vergleich der ASCII-Codes der Zeichen; die Sortierreihenfolge hängt somit von den Zeichen-Codes ab.
Der Befehl sortieren, wiederum nutzt die Sortierreihenfolge, die in den Systemeinstellungen der Sprache festgelegt ist.
Dateiprüfungen
Die folgenden Befehle werden wahrscheinlich am häufigsten in Bash-Skripten verwendet. Sie ermöglichen das Überprüfen verschiedener Bedingungen, die sich auf Dateien beziehen. Hier ist eine Liste dieser Befehle.
-d dateiÜberprüft, ob die Datei existiert und ob es sich um ein Verzeichnis handelt.
-e dateiÜberprüft, ob die Datei existiert.
-f dateiÜberprüft, ob die Datei existiert und ob es sich um eine reguläre Datei handelt.
-r dateiÜberprüft, ob die Datei existiert und ob sie lesbar ist.
-s dateiÜberprüft, ob die Datei existiert und ob sie nicht leer ist.
-w dateiÜberprüft, ob die Datei existiert und ob sie beschreibbar ist.
-x DateiÜberprüft, ob die Datei existiert und ob sie ausführbar ist.
datei1 -nt datei2Überprüft, ob sie neuer ist alsdatei1, alsdatei2.
datei1 -ot datei2Überprüft, ob sie älter ist alsdatei1, alsdatei2.
-O dateiÜberprüft, ob die Datei existiert und ob der aktuelle Benutzer ihr 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, wie viele andere, die wir heute besprochen haben, sind leicht zu merken. Ihre Namen, die Abkürzungen aus verschiedenen Wörtern 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 gibt für ein vorhandenes Verzeichnis dessen Inhalt aus.

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 besprochen, wie man mit dem Schreiben von Bash-Skripten beginnt und einige grundlegende Dinge betrachtet. Das Thema Bash-Programmierung ist in der Tat umfangreich. Dieser Artikel ist eine Übersetzung des ersten Teils einer großen Serie aus 11 Beiträgen. Wenn Sie sofort mehr wollen, finden Sie hier die Liste der Originale dieser Materialien. Zur besseren Übersicht ist auch der Artikel enthalten, den Sie gerade gelesen haben.
- — hier wird erklärt, wie man mit der Erstellung von Bash-Skripten beginnt, die Verwendung von Variablen behandelt, sowie bedingte Strukturen, Berechnungen, den Vergleich von Zahlen und Strings sowie das Abrufen von Informationen über Dateien beschrieben.
- — hier werden die Besonderheiten der Arbeit mit den Schleifen for und while behandelt.
- — in diesem Material geht es um Kommandozeilenparameter und Schlüssel, die an Skripte übergeben werden können, die Verarbeitung von Benutzereingaben und das Lesen von Daten aus Dateien.
- — hier wird über Dateideskriptoren und deren Handhabung, Eingabe- und Ausgabeströme, Fehler und die Umleitung der Ausgabe gesprochen.
- — Dieses Material beschäftigt sich mit Linux-Signalen, deren Verarbeitung in Skripten und dem zeitgesteuerten Ausführen von Skripten.
- — Hier erfahren Sie, wie man Funktionen in Skripten erstellt und verwendet sowie Bibliotheken entwickelt.
- — Dieser Artikel widmet sich der Arbeit mit dem Stream-Texteditor sed.
- — Dieses Material behandelt die Programmierung in der Datenausarbeitungssprache awk.
- — Hier können Sie lesen, wie reguläre Ausdrücke in Bash-Skripten verwendet werden.
- — Hier werden Techniken zur Arbeit mit Nachrichten vorgestellt, die an Benutzer gesendet werden können, sowie Methoden zur Überwachung der Festplatte.
- — Dieses Material widmet sich dem Tool Expect, das die Automatisierung von Interaktionen mit interaktiven Tools ermöglicht. Insbesondere geht es hier um Expect-Skripte und deren Interaktion mit Bash-Skripten und anderen Programmen.
Wir glauben, dass eine der wertvollsten Eigenschaften dieser Artikelreihe darin besteht, dass sie mit den einfachsten Themen beginnt, die für Benutzer jeder Erfahrungsstufe geeignet sind, und nach und nach zu bedeutenden Themen übergeht, sodass allen Interessierten die Möglichkeit gegeben wird, ihre Fähigkeiten im Erstellen von Linux-Befehlszeilen-Skripten zu verbessern.
Liebe Leser! Wir bitten die Bash-Programmier-Gurus, ihre Wege zum Meisterschaftsgrad zu teilen und ihre Geheimnisse preiszugeben, während wir von denen, die gerade ihr erstes Skript geschrieben haben, Eindrücke erwarten.
Nur registrierte Benutzer können an der Umfrage teilnehmen. Sind Sie an Contour interessiert?
Sollten wir die restlichen Teile der Artikelreihe übersetzen?
Ja!
Nein, das ist nicht nötig.
1030 Benutzer haben abgestimmt. 106 Benutzer haben sich enthalten.
Quelle: habr.com
