Heute werden wir über Bash-Skripte sprechen. Das - Befehlszeilenskripte, geschrieben für die Bash-Shell. Es gibt andere Shells wie zsh, tcsh, ksh, aber wir konzentrieren uns auf Bash. Dieses Material ist für jedermann bestimmt, die einzige Voraussetzung ist die Fähigkeit, darin zu arbeiten Befehlszeile Linux.
Befehlszeilenskripte sind Sätze derselben Befehle, die über die Tastatur eingegeben, in Dateien gesammelt und durch einen gemeinsamen Zweck vereint werden können. Gleichzeitig können die Ergebnisse der Teamarbeit entweder einen eigenständigen Wert haben oder als Input für andere Teams dienen. Skripte sind eine leistungsstarke Möglichkeit, häufig ausgeführte Aktionen zu automatisieren.
Wenn wir also über die Befehlszeile sprechen, können Sie mehrere Befehle gleichzeitig ausführen, indem Sie sie mit einem Semikolon eingeben:
pwd ; whoami
Wenn Sie dies in Ihrem Terminal versucht haben, wurde tatsächlich bereits Ihr erstes Bash-Skript geschrieben, das zwei Befehle verwendet. Es funktioniert so. Team zuerst pwd Zeigt Informationen zum aktuellen Arbeitsverzeichnis und dann den Befehl an whoamiZeigt Informationen über den Benutzer an, als den Sie angemeldet sind.
Mit diesem Ansatz können Sie beliebig viele Befehle in einer Zeile kombinieren. Die Grenze liegt nur in der maximalen Anzahl von Argumenten, die an das Programm übergeben werden können. Sie können dieses Limit mit dem folgenden Befehl definieren:
getconf ARG_MAX
Die Befehlszeile ist ein großartiges Werkzeug, aber Sie müssen jedes Mal Befehle eingeben, wenn Sie sie benötigen. Was wäre, wenn wir eine Reihe von Befehlen in eine Datei schreiben und diese Datei einfach aufrufen, um sie auszuführen? Tatsächlich wird die Datei, über die wir sprechen, als Befehlszeilenskript bezeichnet.
Wie Bash-Skripte funktionieren
Erstellen Sie mit dem Befehl eine leere Datei touch. In der ersten Zeile müssen Sie angeben, welche Shell wir verwenden möchten. Wir sind interessiert an bash, also wäre die erste Zeile der Datei:
#!/bin/bash
An anderer Stelle in dieser Datei wird das Hash-Symbol verwendet, um Kommentare anzuzeigen, die die Shell nicht verarbeitet. Allerdings ist die erste Zeile ein Sonderfall, es handelt sich um ein Nummernzeichen gefolgt von einem Ausrufezeichen (diese Sequenz heißt Kram) und der Pfad zu bash, geben Sie dem System an, dass das Skript speziell für erstellt wurde bash.
Shell-Befehle werden durch einen Zeilenvorschub getrennt, Kommentare werden durch ein Nummernzeichen getrennt. So sieht es aus:
#!/bin/bash
# This is a comment
pwd
whoami
Hier können Sie, genau wie in der Befehlszeile, Befehle in eine Zeile schreiben und diese durch ein Semikolon trennen. Wenn Sie jedoch Befehle in verschiedene Zeilen schreiben, ist die Datei einfacher zu lesen. In jedem Fall werden sie von der Shell verarbeitet.
Festlegen von Berechtigungen für eine Skriptdatei
Speichern Sie die Datei, indem Sie ihr einen Namen geben myscript, und das Bash-Skript ist fast fertig. Jetzt müssen Sie diese Datei nur noch ausführbar machen. Andernfalls wird beim Versuch, sie auszuführen, ein Fehler angezeigt Permission denied.
Es wird versucht, eine Skriptdatei mit falsch konfigurierten Berechtigungen auszuführen
Machen wir die Datei ausführbar:
chmod +x ./myscript
Versuchen wir es nun auszuführen:
./myscript
Nach dem Setzen der Berechtigungen funktioniert alles wie es soll.
Bash-Skript erfolgreich ausführen
Nachrichtenausgabe
Um Text auf der Linux-Konsole zu drucken, verwenden Sie den Befehl echo. Nutzen wir das Wissen über diese Tatsache und bearbeiten wir unser Skript, indem wir Erklärungen zu den Daten hinzufügen, die die bereits darin enthaltenen Befehle ausgeben:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Folgendes passiert, nachdem das aktualisierte Skript ausgeführt wurde.
Nachrichten aus einem Skript ausgeben
Jetzt können wir mit dem Befehl erklärende Beschriftungen anzeigen echo. Wenn Sie nicht wissen, wie Sie eine Datei mit Linux-Tools bearbeiten, oder wenn Sie den Befehl noch nicht gesehen haben echo, schau mal rein diese Material.
Verwenden von Variablen
Mit Variablen können Sie Informationen in einer Skriptdatei speichern, z. B. die Ergebnisse von Befehlen, zur Verwendung durch andere Befehle.
Es ist nichts Falsches daran, einzelne Befehle auszuführen, ohne die Ergebnisse ihrer Arbeit zu speichern, allerdings sind die Möglichkeiten dieses Ansatzes sehr begrenzt.
Es gibt zwei Arten von Variablen, die in Bash-Skripten verwendet werden können:
Umgebungsvariablen
Benutzervariablen
Umgebungsvariablen
Manchmal müssen Shell-Befehle mit einigen Systemdaten arbeiten. So zeigen Sie beispielsweise das Home-Verzeichnis des aktuellen Benutzers an:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Bitte beachten Sie, dass wir die Systemvariable verwenden können $HOME in doppelten Anführungszeichen steht, verhindert dies nicht, dass das System es erkennt. Folgendes passiert, wenn Sie das obige Skript ausführen.
Verwenden einer Umgebungsvariablen in einem Skript
Aber was ist, wenn Sie ein Dollarzeichen anzeigen möchten? Lass uns das versuchen:
echo "I have $1 in my pocket"
Das System erkennt ein Dollarzeichen in einer durch Anführungszeichen getrennten Zeichenfolge und geht davon aus, dass wir auf eine Variable verwiesen haben. Das Skript versucht, den Wert einer undefinierten Variablen anzuzeigen. $1. Das ist nicht das, was wir brauchen. Was zu tun ist?
In einer Situation wie dieser hilft die Verwendung des Backslash-Steuerzeichens vor dem Dollarzeichen:
echo "I have $1 in my pocket"
Das Skript gibt nun genau das aus, was erwartet wird.
Verwenden einer Escape-Sequenz zur Ausgabe eines Dollarzeichens
Benutzervariablen
Zusätzlich zu Umgebungsvariablen können Sie mit Bash-Skripten Ihre eigenen Variablen im Skript festlegen und verwenden. Solche Variablen behalten einen Wert, bis das Skript endet.
Wie auf Systemvariablen kann auch auf Benutzervariablen mit dem Dollarzeichen zugegriffen werden:
TNW-CUS-FMP – Aktionscode für 10 % Rabatt auf unsere Dienste, verfügbar zur Aktivierung innerhalb von 7 Tagen
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Folgendes passiert, nachdem ein solches Skript ausgeführt wurde.
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, sodass Sie diese Informationen an einer beliebigen Stelle in der Skriptdatei verwenden können.
Dies kann auf zwei Arten erfolgen.
Mit dem Backtick-Zeichen „`“
Mit Hilfe der Konstruktion $()
Achten Sie beim ersten Ansatz darauf, kein einfaches Anführungszeichen anstelle eines Backticks zu verwenden. Der Befehl muss in zwei solcher Symbole eingeschlossen sein:
mydir=`pwd`
Im zweiten Ansatz wird dasselbe so geschrieben:
mydir=$(pwd)
Und das Skript könnte am Ende so aussehen:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Während seiner Ausführung erfolgt die Ausgabe des Befehls pwdwird in einer Variablen gespeichert mydir, deren Inhalt, mit dem Befehl echo, wird zur Konsole gehen.
Skript, das die Ergebnisse des Befehls in einer Variablen speichert
Mathematische Operationen
Um mathematische Operationen in einer Skriptdatei auszuführen, können Sie eine Konstruktion des Formulars verwenden $((a+b)):
In einigen Szenarien ist es erforderlich, den Ablauf der Befehlsausführung zu steuern. Wenn beispielsweise ein bestimmter Wert größer als fünf ist, muss eine Aktion ausgeführt werden, andernfalls eine andere. Dies ist in sehr vielen Situationen anwendbar, und hier hilft uns die Kontrollstruktur if-then. In seiner einfachsten Form sieht es so aus:
if команда
then
команды
fi
Und hier ist ein funktionierendes Beispiel:
#!/bin/bash
if pwd
then
echo "It works"
fi
In diesem Fall erfolgt die Ausführung des Befehls pwdWenn der Vorgang erfolgreich abgeschlossen wurde, wird in der Konsole der Text „Es funktioniert“ angezeigt.
Lassen Sie uns das vorhandene Wissen nutzen und ein komplexeres Szenario schreiben. Nehmen wir an, wir müssen einen Benutzer finden /etc/passwd, und wenn es gefunden wurde, melden Sie, dass es existiert.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Dies geschieht nach der Ausführung dieses Skripts.
оиск ользователя
Hier haben wir den Befehl verwendet grepum nach einem Benutzer in einer Datei zu suchen /etc/passwd. Wenn das Team grepIhnen unbekannt, die Beschreibung finden Sie hier hier.
Wenn in diesem Beispiel der Benutzer gefunden wird, zeigt das Skript eine entsprechende Meldung an. Was passiert, wenn der Benutzer nicht gefunden werden kann? In diesem Fall schließt das Skript die Ausführung einfach ab, ohne uns etwas mitzuteilen. Ich möchte, dass er uns auch davon erzählt, also lasst uns den Code verbessern.
Das Wenn-Dann-Sonst-Kontrollkonstrukt
Damit das Programm sowohl die Ergebnisse einer erfolgreichen als auch einer fehlgeschlagenen Suche melden kann, verwenden wir die Konstruktion if-then-else. So ist es eingerichtet:
if команда
then
команды
else
команды
fi
Wenn der erste Befehl Null zurückgibt, was bedeutet, dass er erfolgreich ausgeführt wurde, ist die Bedingung wahr und die Ausführung erfolgt nicht entlang der Verzweigung else. Andernfalls, wenn etwas anderes als Null zurückgegeben wird, was einen Fehler oder ein falsches Ergebnis bedeutet, werden die folgenden Befehle ausgeführt else.
Schreiben wir das folgende Skript:
#!/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 Hinrichtung ging auf die lange Bank else.
Ausführen eines Skripts mit einem Wenn-Dann-Sonst-Konstrukt
Nun, machen wir weiter und fragen uns nach schwierigeren Bedingungen. Was ist, wenn Sie nicht nur eine, sondern mehrere Bedingungen überprüfen müssen? Wenn beispielsweise der gewünschte Benutzer gefunden wird, sollte eine Meldung angezeigt werden, wenn eine andere Bedingung erfüllt ist, sollte eine weitere Meldung angezeigt werden und so weiter. In einer solchen Situation helfen uns verschachtelte Bedingungen. Es sieht aus wie das:
if команда1
then
команды
elif команда2
then
команды
fi
Wenn der erste Befehl Null zurückgibt, was auf eine erfolgreiche Ausführung hinweist, werden die Befehle im ersten Block ausgeführt thenAndernfalls wird der zweite Codeblock ausgeführt, wenn die erste Bedingung falsch ist und der zweite Befehl Null zurückgibt.
#!/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 Sie beispielsweise über den Befehl einen neuen Benutzer anlegen useradd, wenn die Suche keine Ergebnisse lieferte, oder etwas anderes Nützliches tun.
Zahlenvergleich
In Skripten können Sie numerische Werte vergleichen. Nachfolgend finden Sie eine Liste relevanter Befehle.
n1 -eq n2Gibt true zurück, wenn n1 ist gleich n2. n1 -ge n2 Gibt true zurück, wenn n1mehr oder gleich n2. n1 -gt n2Gibt true zurück, wenn n1 besser n2. n1 -le n2Gibt true zurück, wenn n1kleiner oder gleich n2. n1 -lt n2Gibt „true“ zurück, wenn n1 kleiner ist als n2. n1 -ne n2Gibt true zurück, wenn n1nicht gleich n2.
Probieren wir als Beispiel einen der Vergleichsoperatoren aus. 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"
fi
Hier sehen Sie, was dieser Befehl ausgibt.
Zahlen in Skripten vergleichen
Variablenwert val1größer als 5, schließlich wird die Verzweigung ausgeführt thenVergleichsoperator und die entsprechende Meldung wird in der Konsole angezeigt.
String-Vergleich
Skripte können auch Zeichenfolgenwerte vergleichen. Vergleichsoperatoren sehen recht einfach aus, aber String-Vergleichsoperatoren weisen bestimmte Besonderheiten auf, auf die wir weiter unten eingehen werden. Hier ist eine Liste der Betreiber.
str1 = str2 Prüft Zeichenfolgen auf Gleichheit und gibt „true“ zurück, wenn Zeichenfolgen identisch sind.
str1 != str2Gibt true zurück, wenn die Zeichenfolgen nicht identisch sind. str1 < str2Gibt true zurück, wenn str1weniger als str2. str1 > str2 Gibt true zurück, wenn str1mehr als str2. -n str1 Gibt true zurück, wenn die Länge vorliegt str1Über Null. -z str1Gibt true zurück, wenn die Länge vorliegt str1gleich Null.
Hier ist ein Beispiel für einen String-Vergleich in einem Skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Als Ergebnis der Skriptausführung erhalten wir Folgendes.
String-Vergleich in Skripten
Hier ist eine erwähnenswerte Funktion des String-Vergleichs. Die Operatoren „>“ und „<“ müssen nämlich mit einem Backslash maskiert werden, da sonst das Skript nicht korrekt funktioniert, obwohl keine Fehlermeldungen erscheinen. Das Skript interpretiert das „>“-Zeichen als Befehl zum Umleiten 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"
fi
Hier sind die Ergebnisse des Skripts.
String-Vergleich, Warnung ausgegeben
Beachten Sie, dass das Skript, obwohl es ausgeführt wird, eine Warnung ausgibt:
./myscript: line 5: [: too many arguments
Um diese Warnung loszuwerden, schließen wir $val2 in doppelten 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"
fi
Jetzt funktioniert alles wie es soll.
String-Vergleich
Ein weiteres Merkmal der Operatoren „>“ und „<“ ist die Art und Weise, wie sie mit Groß- und Kleinbuchstaben arbeiten. Um diese Funktion zu verstehen, bereiten wir eine Textdatei mit folgendem Inhalt vor:
Likegeeks
likegeeks
Speichern Sie es unter einem Namen myfileund führen Sie dann den folgenden Befehl im Terminal aus:
sort myfile
Die Zeilen aus der Datei werden wie folgt sortiert:
likegeeks
Likegeeks
Team sortSortiert Zeichenfolgen standardmäßig in aufsteigender Reihenfolge, was bedeutet, dass der Kleinbuchstabe in unserem Beispiel kleiner als der Großbuchstabe ist. Jetzt bereiten wir ein Skript vor, das dieselben 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"
fi
Wenn Sie es ausführen, stellt sich heraus, dass das Gegenteil der Fall ist – der Kleinbuchstabe ist jetzt größer als der Großbuchstabe.
Sortierbefehl und Zeichenfolgenvergleich in der Skriptdatei
Bei Vergleichsbefehlen sind Großbuchstaben kleiner als Kleinbuchstaben. Der String-Vergleich erfolgt hier durch den Vergleich der ASCII-Zeichencodes, die Sortierreihenfolge ist somit abhängig von den Zeichencodes.
Team sortverwendet wiederum die in den Spracheinstellungen des Systems angegebene Sortierreihenfolge.
Dateiprüfungen
Möglicherweise werden die folgenden Befehle am häufigsten in Bash-Skripten verwendet. Sie ermöglichen Ihnen, verschiedene Bedingungen für Dateien zu überprüfen. Hier ist eine Liste dieser Befehle.
-d fileÜberprüft, ob eine Datei existiert und ob es sich um ein Verzeichnis handelt. -e fileÜberprüft, ob eine Datei vorhanden ist. -f file Überprüft, ob eine Datei existiert und ob es sich um eine Datei handelt. -r fileÜberprüft, ob die Datei existiert und lesbar ist. -s file ПÜberprüft, ob die Datei existiert und nicht leer ist. -w fileÜberprüft, ob die Datei existiert und beschreibbar ist. -x filePrüft, ob eine Datei existiert und ausführbar ist. file1 -nt file2 Überprüft, ob es neuer ist file1Als file2. file1 -ot file2Überprüft, ob älter file1Als file2. -O file Überprüft, ob die Datei existiert und dem aktuellen Benutzer gehört. -G fileÜberprüft, ob die Datei existiert und ob ihre Gruppen-ID mit der Gruppen-ID des aktuellen Benutzers übereinstimmt.
Diese Befehle sowie viele andere, die heute besprochen werden, sind leicht zu merken. Ihre Namen, Abkürzungen für verschiedene Wörter, weisen direkt auf die von ihnen durchgeführten Prüfungen hin.
Probieren wir einen der Befehle in der Praxis aus:
#!/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"
fi
Dieses Skript zeigt für ein vorhandenes Verzeichnis dessen Inhalt an.
Den Inhalt eines Verzeichnisses auflisten
Wir glauben, dass Sie mit den restlichen Befehlen selbst experimentieren können, sie gelten alle nach dem gleichen Prinzip.
Ergebnisse
Heute haben wir darüber gesprochen, wie man mit dem Schreiben von Bash-Skripten beginnt, und einige grundlegende Dinge 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 gleich weitermachen möchten, finden Sie hier eine Liste der Originale dieser Materialien. Der Einfachheit halber ist hier die Übersetzung eingefügt, deren Übersetzung Sie gerade gelesen haben.
Bash-Skript Schritt für Schritt - Hier geht es darum, wie man mit der Erstellung von Bash-Skripten beginnt, die Verwendung von Variablen wird berücksichtigt, bedingte Konstruktionen, Berechnungen, Vergleiche von Zahlen, Zeichenfolgen und das Herausfinden von Informationen über Dateien werden beschrieben.
Bash-Skripting Teil 3, Parameter und Optionen - Dieses Material befasst sich mit Befehlszeilenparametern und Schlüsseln, die an Skripte übergeben werden können, und arbeitet mit Daten, die der Benutzer eingibt und die aus Dateien gelesen werden können.
Bash-Skripting Teil 10, praktische Beispiele - Hier finden Sie Methoden zum Arbeiten mit Nachrichten, die an Benutzer gesendet werden können, sowie eine Methode zur Überwachung der Festplatte.
Bash-Skripting Teil 11, Befehl erwarten - Dieses Material ist dem Expect-Tool gewidmet, mit dem Sie die Interaktion mit interaktiven Dienstprogrammen automatisieren können. Dabei geht es insbesondere um Expect-Skripte und deren Interaktion mit Bash-Skripten und anderen Programmen.
Wir glauben, dass einer der großartigen Aspekte dieser Artikelserie darin besteht, dass sie mit den grundlegendsten Themen beginnt, für Benutzer aller Niveaus geeignet ist und nach und nach zu recht ernsten Themen führt, sodass jeder die Chance hat, in der Linux-Befehlszeilenskripterstellung voranzukommen.
Liebe Leser! Wir bitten Bash-Programmier-Gurus, darüber zu sprechen, wie sie den Gipfel der Meisterschaft erreicht haben, Geheimnisse zu teilen, und wir warten auf Eindrücke von denen, die gerade ihr erstes Skript geschrieben haben.
An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.
Den Rest der Artikelserie übersetzen?
Ja!
Nein, keine Notwendigkeit
1030 Benutzer haben abgestimmt. 106 Benutzer enthielten sich der Stimme.