9 Bash-Skriptbeispiele für den Einstieg in Linux
Veröffentlicht: 2022-07-05Wenn Sie mit Bash-Skripting unter Linux beginnen, ist ein solides Verständnis der Grundlagen von Vorteil. Sie sind die Grundlage für tieferes Wissen und höhere Scripting-Fähigkeiten.
Denken Sie daran, Ihre Skripte ausführbar zu machen
Damit die Shell ein Skript ausführen kann, muss für das Skript die Berechtigung für ausführbare Dateien festgelegt sein. Ohne dies ist Ihr Skript nur eine Textdatei. Damit ist es immer noch eine Textdatei, aber die Shell weiß, dass sie Anweisungen enthält, und versucht, sie auszuführen, wenn das Skript gestartet wird.
Der springende Punkt beim Schreiben von Skripten ist, dass sie ausgeführt werden. Der erste grundlegende Schritt besteht also darin, zu wissen, wie Sie Linux mitteilen, dass Ihr Skript als ausführbar betrachtet werden soll.
Mit dem Befehl chmod
können wir Dateiberechtigungen festlegen. Die Ausführungsberechtigung kann mit dem +x-Flag gesetzt werden.
chmod +x script1.sh
Sie müssen dies für jedes Ihrer Skripte tun. Ersetzen Sie „script1.sh“ durch den Namen Ihres Skripts.
1. Was ist das für eine seltsame erste Zeile?
Die erste Zeile eines Skripts teilt der Shell mit, welcher Interpreter aufgerufen werden soll, um dieses Skript auszuführen. Die erste Zeile muss mit einem Shebang beginnen, „#!“, auch bekannt als Hashbang. Das "#!" teilt der Shell mit, dass diese Zeile den Pfad und Namen des Interpreters enthält, für den das Skript geschrieben wurde.
Dies ist wichtig, denn wenn Sie ein Skript geschrieben haben, das in Bash ausgeführt werden soll, möchten Sie nicht, dass es von einer anderen Shell interpretiert wird. Es kann zu Inkompatibilitäten kommen. Bash hat – wie die meisten Shells – seine eigenen Macken der Syntax und Funktionalität, die andere Shells nicht haben oder anders implementiert haben.
Wenn Sie ein Skript ausführen, öffnet die aktuelle Shell das Skript und bestimmt, welche Shell oder welcher Interpreter verwendet werden soll, um dieses Skript auszuführen. Dann startet es diese Shell und übergibt ihr das Skript.
#!/bin/bash echo Läuft in $SHELL
Die erste Zeile dieses Skripts kann wie folgt gelesen werden: „Verwenden Sie den Interpreter unter /bin/bash, um dieses Skript auszuführen.“
Die einzige Zeile im Skript schreibt den in der $SHELL
Umgebungsvariablen enthaltenen Wert auf den Terminalbildschirm. Dies bestätigt, dass Bash zum Ausführen des Skripts verwendet wurde.
./script1.sh
Als kleinen Salontrick können wir demonstrieren, dass das Skript an jeden von uns ausgewählten Interpreter weitergegeben wird.
#!/bin/kat Alle Textzeilen werden an den cat-Befehl übergeben und werden im Terminalfenster ausgedruckt. Dazu gehört die Shebang-Linie.
script2.sh
Dieses Skript wird von der aktuellen Shell gestartet und an den cat
-Befehl übergeben. Der cat
Befehl „führt“ das Skript aus.
Wenn Sie Ihre Shebangs so schreiben, wird davon ausgegangen, dass Sie wissen, wo sich die Shell oder ein anderer Interpreter auf dem Zielcomputer befindet. Und zu 99% der Zeit ist das in Ordnung. Aber manche Leute sichern ihre Wetten gerne ab und schreiben ihre Shebangs so:
#!/usr/bin/env bash echo Läuft in $SHELL
script3.sh
Wenn das Skript gestartet wird, sucht die Shell nach dem Speicherort der benannten Shell. Wenn sich die Shell zufällig an einem nicht standardmäßigen Ort befindet, kann diese Art von Ansatz „schlechte Interpreter“-Fehler vermeiden.
Hör nicht zu, er lügt!
Unter Linux gibt es immer mehr als einen Weg, einer Katze das Fell zu häuten oder einem Autor das Gegenteil zu beweisen. Um ganz sachlich zu sein, gibt es eine Möglichkeit, Skripte ohne Probleme auszuführen und ohne sie ausführbar zu machen.
Wenn Sie die Shell starten, auf der Sie das Skript ausführen möchten, und das Skript als Befehlszeilenparameter übergeben, wird die Shell das Skript starten und ausführen – unabhängig davon, ob es ausführbar ist oder nicht. Da Sie die Shell in der Befehlszeile auswählen, ist kein Kram nötig.
Dies ist das gesamte Skript:
echo "Ich wurde hingerichtet von" $SHELL
Wir werden ls
verwenden, um zu sehen, dass das Skript wirklich nicht ausführbar ist, und Bash mit dem Namen des Skripts starten:
ls
bash script4.sh
Es gibt auch eine Möglichkeit, ein Skript von der aktuellen Shell ausführen zu lassen, nicht eine Shell, die speziell zum Ausführen des Skripts gestartet wird. Wenn Sie den source
verwenden, der auf einen einzelnen Punkt abgekürzt werden kann „ .
“, wird Ihr Skript von Ihrer aktuellen Shell ausgeführt.
Um also ein Skript ohne Shebang auszuführen, ohne die Berechtigung für ausführbare Dateien und ohne eine andere Shell zu starten, können Sie einen der folgenden Befehle verwenden:
Quelle script4.sh
. script4.sh
Obwohl dies möglich ist, wird es nicht als allgemeine Lösung empfohlen. Es gibt Nachteile.
Wenn ein Skript kein Shebang enthält, können Sie nicht sagen, für welche Shell es geschrieben wurde. Wirst du dich in einem Jahr erinnern? Und ohne dass die Ausführungsberechtigung für das Skript festgelegt ist, identifiziert der Befehl ls
es nicht als ausführbare Datei und verwendet auch keine Farbe, um das Skript von einfachen Textdateien zu unterscheiden.
VERWANDT: Befehlszeilen: Warum stören sich die Leute immer noch an ihnen?
2. Drucken von Text
Das Schreiben von Text an das Terminal ist eine häufige Anforderung. Ein bisschen visuelles Feedback reicht weit.
Für einfache Nachrichten reicht der echo
Befehl aus. Es ermöglicht eine gewisse Formatierung des Textes und lässt Sie auch mit Variablen arbeiten.
#!/bin/bash echo Dies ist eine einfache Zeichenkette. echo "Dies ist eine Zeichenfolge, die 'einfache Anführungszeichen' enthält, also in doppelte Anführungszeichen eingeschlossen ist." echo "Dies gibt den Benutzernamen aus:" $USER echo -e "Mit der Option -e können wir\nFormatierungsanweisungen verwenden,\num den String aufzuteilen."
./script5.sh
Der printf
-Befehl gibt uns mehr Flexibilität und bessere Formatierungsmöglichkeiten, einschließlich Zahlenkonvertierung.
Dieses Skript gibt dieselbe Zahl mit drei verschiedenen Zahlenbasen aus. Die hexadezimale Version ist ebenfalls so formatiert, dass sie in Großbuchstaben gedruckt wird, mit führenden Nullen und einer Breite von drei Ziffern.
#!/bin/bash printf "Dezimal: %d, Oktal: %o, Hexadezimal: %03X\n" 32 32 32
./script6.sh
Beachten Sie, dass Sie im Gegensatz zu echo
printf
mit dem Token „ \n
“ anweisen müssen, eine neue Zeile zu beginnen.
3. Erstellen und Verwenden von Variablen
Variablen ermöglichen es Ihnen, Werte in Ihrem Programm zu speichern und sie zu manipulieren und zu verwenden. Sie können Ihre eigenen Variablen erstellen oder Umgebungsvariablen für Systemwerte verwenden.
#!/bin/bash millennium_text="Jahre seit dem Jahrtausend:" aktuelle_zeit=$( Datum '+%H:%M:%S' ) todays_date=$( Datum '+%F' ) Jahr=$( Datum '+%Y' ) echo "Aktuelle Zeit:" $aktuelle_Zeit echo "heutiges Datum:" $todays_date years_since_Y2K=$(( Jahr - 2000 )) echo $millennium_text $years_since_Y2K
Dieses Skript erstellt eine Zeichenfolgenvariable mit dem Namen millennium_text
. Es enthält eine Textzeile.
Anschließend erstellt es drei numerische Variablen.
- Die Variable
current_time
wird zum Zeitpunkt der Ausführung des Skripts initialisiert. - Die Variable
todays_date
wird auf das Datum gesetzt, an dem das Skript ausgeführt wird. - Die
year
-Variable enthält das aktuelle Jahr.
Um auf den in einer Variablen gespeicherten Wert zuzugreifen, stellen Sie ihrem Namen ein Dollarzeichen „$“ voran.
./script7.sh
Das Skript gibt Uhrzeit und Datum aus, berechnet dann, wie viele Jahre seit dem Jahrtausend vergangen sind, und speichert dies in der Variable years_since_Y2K
.
Schließlich gibt es die in der Variable millennium_text
enthaltene Zeichenfolge und den in years_since_Y2K
gespeicherten numerischen Wert aus.
VERWANDT: So arbeiten Sie mit Variablen in Bash
4. Umgang mit Benutzereingaben
Damit ein Benutzer einen Wert eingeben kann, den das Skript verwendet, müssen Sie in der Lage sein, die Tastatureingabe des Benutzers zu erfassen. Der Bash read
ermöglicht es ut, genau das zu tun. Hier ist ein einfaches Beispiel.
#!/bin/bash echo "Geben Sie eine Zahl ein und drücken Sie \"Enter\"" Benutzernummer1 lesen; echo "Geben Sie eine andere Zahl ein und drücken Sie \"Enter\"" Benutzernummer2 lesen; printf "Du hast eingegeben: %d und %d\n" $user_number1 $user_number2 printf "Zusammengenommen ergeben sie: %d\n" $(( user_number1 + user_number2))
Das Skript fordert zur Eingabe von zwei Zahlen auf. Sie werden von der Tastatur gelesen und in zwei Variablen gespeichert, user_number1
und user_number2
.
Das Skript gibt die Zahlen im Terminalfenster aus, addiert sie und gibt die Summe aus.
./script8.sh
Wir können die Eingabeaufforderungen mit der Option -p
(Eingabeaufforderung) zu den read
kombinieren.
#!/bin/bash read -p "Geben Sie eine Zahl ein und drücken Sie \"Enter\" " user_number1; read -p "Geben Sie eine andere Nummer ein und drücken Sie \"Enter\" " user_number2; printf "Du hast eingegeben: %d und %d\n" $user_number1 $user_number2 printf "Zusammengenommen ergeben sie: %d\n" $(( user_number1 + user_number2))
Dies macht die Dinge übersichtlicher und einfacher zu lesen. Leicht lesbare Skripts lassen sich auch leichter debuggen.
./script9.sh
Das Skript verhält sich jetzt etwas anders. Die Benutzereingabe befindet sich in derselben Zeile wie die Eingabeaufforderung.
Verwenden Sie die Option -s
(silent), um Tastatureingaben aufzuzeichnen, ohne dass sie an das Terminalfenster ausgegeben werden.
#!/bin/bash read -s -p "Geben Sie Ihre geheime PIN ein und drücken Sie \"Enter\" " secret_PIN; printf "\nShhh ... es ist %d\n" $secret_PIN
./script10.sh
Der Eingabewert wird erfasst und in einer Variablen namens secret_PIN
gespeichert, aber er wird nicht auf dem Bildschirm angezeigt, wenn der Benutzer ihn eingibt. Was Sie danach damit machen, bleibt Ihnen überlassen.
5. Parameter akzeptieren
Manchmal ist es bequemer, Benutzereingaben als Befehlszeilenparameter zu akzeptieren, als ein Skript auf Eingaben warten zu lassen. Das Übergeben von Werten an ein Skript ist einfach. Sie können innerhalb des Skripts so referenziert werden, als wären sie jede andere Variable.
Der erste Parameter wird zur Variablen $1
, der zweite Parameter zur Variablen $2
und so weiter. Die Variable $0
enthält immer den Namen des Skripts, und die Variable $#
enthält die Anzahl der Parameter, die auf der Befehlszeile bereitgestellt wurden. Die Variable $@
ist eine Zeichenfolge, die alle Befehlszeilenparameter enthält.
#!/bin/bash printf "Dieses Skript heißt: %s\n" $0 printf "Sie haben %d Befehlszeilenparameter verwendet\n" $# # Schleife durch die Variablen für Parameter in "$@"; tun echo "$param" erledigt echo "Parameter 2 war:" $2
Dieses Skript verwendet $0
und $#
, um einige Informationen auszugeben. verwendet dann ?@
, um alle Befehlszeilenparameter zu durchlaufen. Es verwendet $2
, um zu zeigen, wie auf einen einzelnen, bestimmten Parameterwert zugegriffen werden kann.
./script11.sh
Wenn Sie mehrere Wörter in Anführungszeichen „““ einschließen, werden sie zu einem einzigen Parameter zusammengefasst.
6. Lesen von Daten aus Dateien
Zu wissen, wie man Daten aus einer Datei liest, ist eine großartige Fähigkeit. Wir können dies in Bash mit einer While-Schleife tun.
#!/bin/bash LineCount=0 while IFS='' read -r LinefromFile || [[ -n "${ZeileausDatei}" ]]; tun ((Zeilenzahl++)) echo "Zeile $LineCount lesen: ${LinefromFile}" erledigt < "$1"
Wir übergeben den Namen der Datei, die das Skript verarbeiten soll, als Befehlszeilenparameter. Es wird der einzige Parameter sein, also enthält $1
innerhalb des Skripts den Dateinamen. Wir leiten diese Datei in die while
-Schleife um.
Die while
-Schleife setzt das interne Feldtrennzeichen mithilfe der Zuweisung IFS=''
auf einen leeren String. Dadurch wird verhindert, dass der read
Zeilen an Leerzeichen teilt. Nur der Wagenrücklauf am Ende einer Zeile gilt als wahres Zeilenende.
Die Klausel [[ -n "${LinefromFile}" ]]
die Möglichkeit, dass die letzte Zeile in der Datei nicht mit einem Wagenrücklauf endet. Selbst wenn dies nicht der Fall ist, wird diese letzte Zeile korrekt behandelt und als reguläre POSIX-kompatible Zeile behandelt.
./script12.sh twinkle.txt
7. Bedingte Tests verwenden
Wenn Sie möchten, dass Ihr Skript unterschiedliche Aktionen für unterschiedliche Bedingungen ausführt, müssen Sie Bedingungstests durchführen. Die Test-Syntax mit zwei Klammern liefert eine – zunächst – überwältigende Anzahl von Optionen.
#!/bin/bash Preis = 1 $ if [[ price -ge 15 ]]; dann Echo "Zu teuer." anders Echo "Kaufen!" fi
Bash bietet eine ganze Reihe von Vergleichsoperatoren, mit denen Sie beispielsweise feststellen können, ob eine Datei existiert, ob Sie aus ihr lesen, ob Sie darauf schreiben können und ob ein Verzeichnis existiert.
Es hat auch numerische Tests für gleich -qe
, größer als -gt
, kleiner als oder gleich -le
und so weiter, obwohl Sie auch die vertraute Notation ==
, >=
, <=
verwenden können.
./script13.sh 13
./script13.sh 14
./script13.sh 15
./script13.sh 16
8. Die Macht der for-Schleifen
Das wiederholte Wiederholen von Aktionen wird am besten mit Schleifen erreicht. Mit einer for
-Schleife können Sie eine Schleife mehrmals ausführen. Dies kann bis zu einer bestimmten Zahl sein oder bis die Schleife sich durch eine Liste von Elementen gearbeitet hat.
#!/bin/bash für (( i=0; i<=$1; i++ )) tun echo "For-Schleife im C-Stil:" $i erledigt für i in {1..4} tun echo "For-Schleife mit einem Bereich:" $i erledigt für i in "null" "eins" "zwei" "drei" tun echo "For-Schleife mit einer Liste von Wörtern:" $i erledigt website="How To Geek" für i in $website tun echo "For-Schleife mit einer Sammlung von Wörtern:" $i erledigt
Alle diese Schleifen sind for
-Schleifen, aber sie arbeiten mit unterschiedlichen Arten von Schleifenanweisungen und Daten.
./script14.sh 3
Die erste Schleife ist eine klassische for
-Schleife im C-Stil. Der Schleifenzähler i
wird auf Null initialisiert und mit jedem Zyklus der Schleife inkrementiert. Solange der Wert von i
kleiner oder gleich dem in $1
gehaltenen Wert ist, wird die Schleife weiter ausgeführt.
Die zweite Schleife bearbeitet den Zahlenbereich von 1 bis 4. Die dritte Schleife bearbeitet eine Wortliste. Während weitere Wörter verarbeitet werden müssen, wiederholt sich die Schleife immer wieder.
Die letzte Schleife arbeitet die Liste der Wörter in einer String-Variablen ab.
9. Funktionen
Mit Funktionen können Sie Codeabschnitte in benannte Routinen kapseln, die von überall in Ihrem Skript aufgerufen werden können.
Angenommen, wir wollten, dass unser Skript, das Zeilen aus einer Datei liest, jede Zeile irgendwie verarbeitet. Es wäre praktisch, diesen Code in einer Funktion enthalten zu haben.
#!/bin/bash LineCount=0 Funktion count_words() { printf "%d Wörter in Zeile %d\n" $(echo $1 | wc -w) $2 } while IFS='' read -r LinefromFile || [[ -n "${ZeileausDatei}" ]]; tun ((Zeilenzahl++)) count_words "$LinefromFile" $LineCount erledigt < "$1" count_words "Das ist nicht in der Schleife" 99
Wir haben unser Programm zum Lesen von Dateien modifiziert, indem wir eine Funktion namens count_words
. Es wird definiert, bevor wir es verwenden müssen.
Die Funktionsdefinition beginnt mit dem Wort function
. Darauf folgt ein eindeutiger Name für unsere Funktion, gefolgt von Klammern „ ()
“. Der Hauptteil der Funktion ist in geschweiften Klammern „{}“ enthalten.
Die Funktionsdefinition bewirkt nicht, dass irgendein Code ausgeführt wird. Nichts in der Funktion wird ausgeführt, bis die Funktion aufgerufen wird.
Die Funktion count_words
die Anzahl der Wörter in einer Textzeile und die Zeilennummer aus. Diese beiden Parameter werden genau wie Parameter an ein Skript an die Funktion übergeben. Der erste Parameter wird zur Funktionsvariablen $1
und der zweite Parameter zur Funktionsvariablen $2
und so weiter.
Die while
-Schleife liest jede Zeile aus der Datei und übergibt sie zusammen mit der Zeilennummer an die Funktion count_words
. Und nur um zu zeigen, dass wir die Funktion von verschiedenen Stellen innerhalb des Skripts aufrufen können, rufen wir sie noch einmal außerhalb der while
-Schleife auf.
./script15.sh twinkle.txt
Keine Angst vor der Lernkurve
Scripting ist lohnend und nützlich, aber schwer zu erlernen. Sobald Sie sich einige wiederverwendbare Techniken angeeignet haben, können Sie relativ einfach lohnende Skripte schreiben. Dann können Sie sich mit erweiterten Funktionen befassen.
Gehen Sie, bevor Sie laufen können, und nehmen Sie sich Zeit, um die Reise zu genießen.
VERWANDT: 10 grundlegende Linux-Befehle für Anfänger