| Shell-Skript | |
|---|---|
| |
| Dateiendung: | .sh |
| MIME-Type: | text/x-shellscript[1] |
| Erstveröffentlichung: | mitUNIX |
| Art: | Skriptsprache |
| Enthalten in: | Unix-Shell |
| Erweitert von: | div. Unix-Shells, u. a.Bash,Z shell u.v.m. |
| Standard(s): | POSIX |
| |
EinShellskript oderShell-Skript ist einComputerprogramm, das von einerShell interpretiert und ausgeführt wird. Es ist letztlich eine ausführbare Textdatei, in der all jeneAnweisungen verwendet werden können, die einBenutzer auch in derBefehlszeile der Shell nutzen kann.[1]
Die Shell selbst ist auch eine Programmiersprache, wobei in verschiedenen Shells unterschiedliche Skriptsprachen verwendet werden.
“The shell is actually a programming language: it has variables, loops, decision-making, and so on.”
„Die Shell ist eigentlich eine Programmiersprache: es gibt Variablen, Schleifen, Verzweigungen und so weiter.“
Der BegriffShellskript wird überwiegend fürUnix-Shell-Skripte verwendet und bezieht sich daher vorwiegend aufunixähnliche Systeme, obwohl auch andere Betriebssysteme und Shells ähnliche Skripte nutzen, aber anders bezeichnen.
Shellskripte gehen auf das 1965 geschriebene ProgrammRUNCOM zurück, das vonLouis Pouzin für das BetriebssystemMultics entwickelt wurde. Von ihm stammt auch der Begriff „Shell“, wobei die Weiterentwicklung der Multics-Shell die Fähigkeiten vonRUNCOM integrierte.[3]
Die Entwickler vonUnix nahmen sich Multics als Vorlage, sodass die ursprüngliche Unix-Shell stark von der Multics-Shell inspiriert war. Auch die Shells späterer Betriebssysteme haben das Konzept der Shellskripte übernommen. BeiKommandozeileninterpretern vonDOS, technisch gesehen ebenfalls Shells (z. B.COMMAND.COM oder4DOS), werden Skripte alsStapelverarbeitungsdateien oder „Batch-Dateien“ (vonenglischbatch jobs fürStapelverarbeitung) bezeichnet. Bei derPowerShell vonMicrosoft heißen sie „PowerShell-Skripte“.[4]
Da unterschiedliche Unix-Shells, wie z. B. dieBash oder dieC-Shell, nicht die gleicheSyntax bzw. Skriptsprache nutzen, ist ein Shellskript in der Regel nur für eine spezifische Shell nutzbar, sofern die eingesetzte Shell nicht die Syntax der anderen Shell versteht.
Anders ist dies bei der inPOSIX spezifizierten Syntax. Diese Spezifikation ermöglicht den systemübergreifenden Einsatz eines Skripts und dieInteroperabilität mehrerer Systeme. Freilich muss dabei eine POSIX unterstützende Shell eingesetzt werden. Die erste POSIX-Spezifikation fußt auf derKornshell und berücksichtigt die Eigenheiten derBourne-Shell. Heute genutzte Shells verwenden meistens eine an POSIX orientierte Syntax. Darüber hinaus haben die meisten heute genutzten Shells einen sogenannten POSIX-Modus, der dazu führt, dass die verwendete Shell die POSIX-Syntax verwendet und nicht ihre native Syntax.[5]
Nachfolgend eine Liste von Unix-Shells, gegliedert nach Syntax-Angabe perShebang.
#!/bin/sh (ursprünglich, vor POSIX)#!/bin/sh (nach Einführung von POSIX)#!/bin/bash (heute wahrscheinlich meist-eingesetzte Shell)In der ersten Zeile eines Shellskripts – auchHeader genannt – wird festgelegt, welcher Interpreter das Skript abarbeiten soll. Ein Shellskript beginnt daher mit dem sogenanntenShebang,#!, gefolgt von der Pfadangabe zur Shell, die das Skript interpretieren soll.[6] Wird diese Zeile weggelassen, so wird das Skript von jener Shell interpretiert, die auch neu erstellten Benutzerkonten standardmäßig zugewiesen wird. Welche das konkret ist, hängt vom verwendeten System und dessen Voreinstellung ab. Auch historische Shellskripte verwenden keinen Shebang, da es erst nach der Einführung von UNIX V7 alternative Shells gab.
Das folgende Beispiel zeigt ein einfaches Shellskript inPOSIX-Syntax mit einerfor-Schleife (loop). Die Anzahl der Durchläufe wird durch die Anzahl an Werten bestimmt; hier drei:'Alfa Romeo','Bentley','Citroën'. Zum besseren Verständnis sind alle Werte hier in Anführungszeichen gesetzt, dies ist aber nur bei'Alfa Romeo' notwendig, da darin ein Leerzeichen vorkommt. Ohne die Anführungszeichen würden dabei zwei Werte interpretiert werden:Alfa undRomeo. Zu beachten ist, dass die Anführungszeichen nicht Teil des Wertes sind.
Bei jedem Durchlauf wird die Variablei neu gefüllt und ihr Inhalt dann in die Standardausgabe geschrieben (stdout, sieheStandard-Datenströme). Beim ersten Durchlauf wird die Variable mitAlfa Romeo gefüllt, beim zweiten mitBentley, beim dritten mitCitroën. Dann endet die Schleife, da es keinen weiteren Wert gibt.
#!/bin/shforiin'Alfa Romeo''Bentley''Citroën';doecho$idone
Das Auslesen der Variablei erfolgt, indem ein Dollarzeichen davor geschrieben wird:$i.
Da das Programmecho schlicht alles ausgibt, was dahinter geschrieben steht (abgesehen von Kommentaren), ist es an dieser Stelle nicht nötig, die Variable in doppelte Anführungszeichen zu setzen. Soll der Wert der Variable aber anderweitig verwendet werden, müssen doppelte Anführungszeichen verwendet werden ("$i"), damit aus Werten wieAlfa Romeo nicht doch noch mehrere Werte werden. Würden dann einfache Anführungszeichen verwendet werden ('$i'), würde nicht der Inhalt der Variable ausgegeben, sondern die Zeichenkette$i unverändert als solche.
Eine Besonderheit, im Gegensatz zu anderen Programmiersprachen, ist die zwingende Verwendung vonLeerzeichen beim Aufruf von Operatoren und Funktionen.[7]
Vergleichsoperatoren des folgenden Beispiels:==,<,>,<=,>=,!
if((1==5));thenecho"1 und 5 sind gleich"elseecho"1 und 5 sind nicht gleich"fi
Standardmäßig sind neu erstellte Dateien unter Unix nicht ausführbar. Um ein Shellskript ausführen zu können, muss es über dieZugriffsrechte auf „ausführbar“ gesetzt werden. Dies geschieht durch das Programmchmod mit folgendem (oder ähnlichem) Befehl:
chmod+xscript.sh
Soll das Shellskript von einem beliebigenPfad aus ausgeführt werden, muss der komplette Pfad zum Shellskript angegeben werden.
Beispiel: Das Shellskript /usr/local/bin/script.sh soll ausgeführt werden. Es muss folgender Befehl eingegeben werden:
/usr/local/bin/script.sh
Falls das Shellskript im aktuellenArbeitsverzeichnis (englisch „working directory“) gespeichert ist und dort ausgeführt werden soll, geschieht dies durch Voranstellen des aktuellen Pfads./:
./script.sh
Das Arbeitsverzeichnis des Shellskripts ist derPfad, von dem aus es aufgerufen wird, also nicht der Ort, wo es sich selbst befindet.
Eine Dateinamenerweiterung für Shellskript-Dateien ist gänzlich unnötig. Sie wird ausschließlich hinzugefügt, um einem Benutzer grob Informationen über den Inhalt der Datei zu geben oder um sie innerhalb einer Desktop-Umgebung einem Programm zum Bearbeiten per Doppelklick zuzuweisen – i. d. Regel einemTexteditor oder einerintegrierten Entwicklungsumgebung.
Die Erweiterung kann beispielsweise allgemein.sh lauten. Spezieller sind Erweiterungen wie.bash oder.zsh. Texteditoren und ähnlichen dient die Erweiterung zum Anwenden passenderSyntaxhervorhebung.
Der Inhaltstyp (Content Type oderMIME-Type) kann – abhängig vom System – wie folgt lauten: