„Shellskript“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
Y2kbug (Diskussion | Beiträge) K Mehrzahl |
He3nry (Diskussion | Beiträge) K Änderungen von 2A02:8070:D8B:8DA0:0:0:0:4D62 (Diskussion) auf die letzte Version von Y2kbug zurückgesetzt Markierung: Zurücksetzung |
||
(42 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
| Beschreibung = Shell-Skript <code>.bash_profile</code> im [[Texteditor]] [[ed (Texteditor)|ed]] |
| Beschreibung = Shell-Skript <code>.bash_profile</code> im [[Texteditor]] [[ed (Texteditor)|ed]] |
||
| Dateiendung = .sh |
| Dateiendung = .sh |
||
| MIME = |
| MIME = text/x-shellscript |
||
| MIME-Anm = <ref name="DebianWiki-ShellScript">{{Internetquelle |url=https://wiki.debian.org/ShellScript |titel=ShellScript |abruf=2021-03-26 |werk=Debian Wiki |sprache=en}}</ref> |
|||
| MIME-Anm = |
|||
| MagischeZahl = |
| MagischeZahl = |
||
| MagischeZahlNotation = |
| MagischeZahlNotation = |
||
Zeile 24: | Zeile 24: | ||
}} |
}} |
||
Ein '''Shellskript''' oder '''Shell-Skript''' ist ein [[Computerprogramm]], das von einer [[Shell (Betriebssystem)|Shell]] interpretiert und ausgeführt wird. Es ist letztlich eine ausführbare Textdatei, in der all jene [[Anweisung (Programmierung)|Anweisungen]] verwendet werden können, die ein [[Benutzer]] auch in der [[Befehlszeile]] nutzen kann. |
Ein '''Shellskript''' oder '''Shell-Skript''' ist ein [[Computerprogramm]], das von einer [[Shell (Betriebssystem)|Shell]] interpretiert und ausgeführt wird. Es ist letztlich eine ausführbare Textdatei, in der all jene [[Anweisung (Programmierung)|Anweisungen]] verwendet werden können, die ein [[Benutzer]] auch in der [[Befehlszeile]] der Shell nutzen kann.<ref name="DebianWiki-ShellScript"/> |
||
⚫ | |||
⚫ | |||
{{Zitat |
{{Zitat |
||
|Text=The shell is actually a programming language: it has variables, loops, decision-making, and so on. |
|Text=The shell is actually a programming language: it has variables, loops, decision-making, and so on. |
||
|Quelle=Brian Kernighan |
|Quelle=[[Brian W. Kernighan]] |
||
|Sprache=en |
|Sprache=en |
||
|Übersetzung=Die Shell ist eigentlich eine Programmiersprache: es gibt Variablen, Schleifen, Verzweigungen und so weiter. |
|Übersetzung=Die Shell ist eigentlich eine Programmiersprache: es gibt Variablen, Schleifen, Verzweigungen und so weiter. |
||
⚫ | |||
Der Begriff ''Shellskript'' wird überwiegend für [[Unix-Shell]]-Skripte verwendet und bezieht sich daher vorwiegend auf [[Unixoides System|unixähnliche Systeme]], obwohl auch andere Betriebssysteme und Shells ähnliche Skripte nutzen, aber anders bezeichnen. |
|||
⚫ | |||
== Ursprung == |
|||
Obwohl jede Shell die Möglichkeit besitzt, Shellskripte auszuführen, wird der Begriff ''Shellskript'' überwiegend für [[Unix-Shell]]-Skripte verwendet. Dieser Artikel bezieht sich daher auf Skripte in [[Unixoides System|unixähnlichen Systemen]]. |
|||
Shellskripte gehen auf das 1965 geschriebene Programm <samp>RUNCOM</samp> zurück, das von [[Louis Pouzin]] für das Betriebssystem [[Multics]] entwickelt wurde. Von ihm stammt auch der Begriff „Shell“, wobei die Weiterentwicklung der Multics-Shell die Fähigkeiten von <samp>RUNCOM</samp> integrierte.<ref>{{Literatur |Autor=Chantal Lebrument, Fabien Soyez |Titel=The Inventions of Louis Pouzin: One of the Fathers of the Internet |Verlag=Springer Nature |Datum=2019-12-7 |Sprache=en |ISBN=978-3-03034836-6 |Seiten=24 |Online={{Google Buch |BuchID=F7nEDwAAQBAJ |Seite=24 |Hervorhebung=RUNCOM}} |Zitat=At the beginning of 1965, he developed the RUNCOM program, an “interpreter” that makes it possible to execute a set of commands contained in a file, and makes parameter substitution possible.}}</ref> |
|||
Bei [[Kommandozeileninterpreter]]n von [[Disk Operating System|DOS]], |
Die Entwickler von [[Unix]] 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. Bei [[Kommandozeileninterpreter]]n von [[Disk Operating System|DOS]], technisch gesehen ebenfalls Shells (z. B. [[COMMAND.COM]] oder [[4DOS]]), werden Skripte als [[Stapelverarbeitungsdatei]]en oder „Batch-Dateien“ (von {{enS|batch jobs}} für [[Stapelverarbeitung]]) bezeichnet. Bei der [[PowerShell]] von [[Microsoft]] heißen sie „PowerShell-Skripte“.<ref>[https://www.itworld.com/article/2817193/unix-tip--use-your-unix-scripting-skills-to-write-a-batch-file.html itworld.com]</ref> |
||
== |
== Syntaxen verschiedener Unix-Shells == |
||
Da unterschiedliche Unix-Shells, wie z. B. die [[Bash (Shell)|Bash]] oder die [[Unix-Shell#Die C-Shell|C-Shell]] nicht die gleiche [[Syntax]] nutzen, ist ein Shellskript in der Regel nur für eine spezifische Shell nutzbar. |
Da unterschiedliche Unix-Shells, wie z. B. die [[Bash (Shell)|Bash]] oder die [[Unix-Shell#Die C-Shell|C-Shell]], nicht die gleiche [[Syntax]] 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 in [[POSIX]] spezifizierten Syntax. Diese Spezifikation ermöglicht den systemübergreifenden Einsatz eines Skripts und die [[Interoperabilität]] mehrerer Systeme. Freilich muss dabei eine POSIX unterstützende Shell eingesetzt werden. Die erste POSIX-Spezifikation fußt auf der [[Kornshell]] und berücksichtigt die Eigenheiten der [[Unix-Shell#Die Bourne-Shell|Bourne-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.<ref>{{Internetquelle |url=https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html |titel=Bash POSIX Mode |abruf=2021-03-26 |werk=Bash Reference Manual}}</ref> |
|||
Folgende Unix-Shells nutzen eine gemeinsame Syntax-Grundlage: |
|||
Nachfolgend eine Liste von Unix-Shells, gegliedert nach Syntax-Angabe per [[Shebang]]. |
|||
⚫ | |||
:* sh |
|||
:* bash<ref>[http://www.gnu.org/software/bash/ bash] gnu.org</ref> |
|||
:* [[Kornshell|ksh]] |
|||
⚫ | |||
⚫ | |||
:* [[Unix-Shell#Die Debian-Almquist-Shell|dash]]<ref>[https://wiki.ubuntuusers.de/Dash/ ubuntuusers.de/Dash]</ref> |
|||
* <code>#!/bin/sh</code> (ursprünglich, vor POSIX) |
|||
: [[Unix-Shell#Die C-Shell|C shell]]-kompatible Shells |
|||
** [[Thompson-Shell]], die ursprüngliche UNIX-Shell |
|||
:* csh |
|||
** [[Unix-Shell#Die Bourne-Shell|Bourne-Shell]], die ab UNIX V7 die Thompson-Shell als Standard-Shell ablöste |
|||
:* tcsh |
|||
* <code>#!/bin/sh</code> (nach Einführung von POSIX) |
|||
⚫ | |||
⚫ | |||
** [[Bash (Shell)|Bourne-Again-Shell]], kurz GNU Bash, im POSIX-Modus |
|||
⚫ | |||
** [[Unix-Shell #Die TENEX-C-Shell|TENEX-C-Shell]] (tcsh), konform zu POSIX.1:2008 |
|||
** [[Kornshell|KornShell]] (ksh) und [[Unix-Shell #Die Public-Domain-Korn-Shell|Public-Domain-Korn-Shell]] (pdksh), beide konform zu POSIX.2 |
|||
** [[Z-Shell]] (zsh) im POSIX-Modus |
|||
* <code>#!/bin/bash</code> (heute wahrscheinlich meist-eingesetzte Shell) |
|||
** GNU Bash (bash, Bourne-Again-Shell); bewusst nicht POSIX-konform, hat aber einen konformen Modus |
|||
** Z-Shell (zsh), versteht auch die Bash-Syntax |
|||
== Aufbau == |
|||
: [[Unix-Shell#Die Thompson-Shell|Thompson-Shell]]-kompatible Shells |
|||
In der ersten Zeile eines Shellskripts – auch [[Header]] genannt – wird festgelegt, welcher Interpreter das Skript abarbeiten soll. Ein Shellskript beginnt daher mit dem sogenannten [[Shebang]], <code>#!</code>, gefolgt von der Pfadangabe zur Shell, die das Skript interpretieren soll.<ref>''[[b:en:Bash Shell Scripting|Bash Shell Scripting]]''. [[Wikibooks]] (englisch)</ref> 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. |
|||
:* osh |
|||
Das folgende Beispiel zeigt ein einfaches Shellskript in [[POSIX]]-Syntax mit einer <code>for</code>-Schleife ({{lang|en|loop}}). Die Anzahl der Durchläufe wird durch die Anzahl an Werten bestimmt; hier drei: <code>'Alfa Romeo'</code>, <code>'Bentley'</code>, <code>'Citroën'</code>. Zum besseren Verständnis sind alle Werte hier in Anführungszeichen gesetzt, dies ist aber nur bei <code>'Alfa Romeo'</code> notwendig, da darin ein Leerzeichen vorkommt. Ohne die Anführungszeichen würden dabei zwei Werte interpretiert werden: <samp>Alfa</samp> und <samp>Romeo</samp>. Zu beachten ist, dass die Anführungszeichen nicht Teil des Wertes sind. |
|||
: [[Zsh|Z shell]]-kompatible Shells |
|||
:* zsh |
|||
Bei jedem Durchlauf wird die Variable <code>i</code> neu gefüllt und ihr Inhalt dann in die Standardausgabe geschrieben (<samp>stdout</samp>, siehe [[Standard-Datenströme]]). Beim ersten Durchlauf wird die Variable mit <samp>Alfa Romeo</samp> gefüllt, beim zweiten mit <samp>Bentley</samp>, beim dritten mit <samp>Citroën</samp>. Dann endet die Schleife, da es keinen weiteren Wert gibt. |
|||
== Dateiformat == |
|||
In der ersten Zeile des Shellskripts wird festgelegt, mit welcher Shell das Skript ausgeführt werden soll. Dies geschieht durch die Angabe des [[Pfadname|Dateipfades]] zum jeweiligen Shell-Programm. |
|||
Innerhalb eines Shellskripts können Programme aufgerufen und Variable benutzt werden. Außerdem sind Verzweigungen und Schleifen möglich. |
|||
⚫ | |||
Ein Shellskript startet mit dem [[Shebang]], <code>#!</code>, gefolgt von der Pfadangabe zur Shell.<ref>''[[b:en:Bash Shell Scripting|Bash Shell Scripting]]''. [[Wikibooks]] (englisch)</ref> Falls die erste Zeile (mit dem Shebang) weggelassen wird, wird das Skript jedoch meist trotzdem als Shellskript ausgeführt. Welche Shell standardmäßig hierfür genutzt wird, ist jedoch vom jeweiligen [[Unix#UNIX-Derivate und unix%C3%A4hnliche Betriebssysteme|Unix-Derivat]] abhängig. Das Weglassen der Shebang-Zeile führt dazu, dass nicht gesichert werden kann, mit welcher Shell das Skript ausgeführt wird, und ist daher nicht empfohlen. |
|||
⚫ | |||
for i in 'Alfa Romeo' 'Bentley' 'Citroën'; do |
|||
Die am meisten verbreitete Unix-Shell ist die Bash Shell. Daher wird im folgenden Beispielcode in der ersten Zeile ein Dateipfad verwendet, der auf die Bash Shell zeigt: |
|||
⚫ | |||
⚫ | |||
# Shellskript für die Bash |
|||
for i in 0 1 2 |
|||
do |
|||
echo $i |
echo $i |
||
done |
done |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
Das Auslesen der Variable <code>i</code> erfolgt, indem ein Dollarzeichen davor geschrieben wird: <code>$i</code>. |
|||
Da das Programm [[echo (Informatik)|echo]] 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 (<code>"$i"</code>), damit aus Werten wie <samp>Alfa Romeo</samp> nicht doch noch mehrere Werte werden. Würden dann einfache Anführungszeichen verwendet werden (<code>'$i'</code>), würde nicht der Inhalt der Variable ausgegeben, sondern die Zeichenkette <samp>$i</samp> unverändert als solche. |
|||
== Besonderheiten == |
== Besonderheiten == |
||
Zeile 84: | Zeile 88: | ||
Eine Besonderheit, im Gegensatz zu anderen Programmiersprachen, ist die zwingende Verwendung von [[Leerzeichen]] beim Aufruf von Operatoren und Funktionen.<ref>[https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions opensource.com]</ref> |
Eine Besonderheit, im Gegensatz zu anderen Programmiersprachen, ist die zwingende Verwendung von [[Leerzeichen]] beim Aufruf von Operatoren und Funktionen.<ref>[https://opensource.com/article/19/10/programming-bash-logical-operators-shell-expansions opensource.com]</ref> |
||
⚫ | |||
Beispiele: |
|||
<code>==</code>, <code><</code>, <code>></code>, <code><=</code>, <code>>=</code>, <code>!</code> |
|||
* [[Test (Unix)|Test-Funktionen]] [ ] und (( )) |
|||
⚫ | |||
<syntaxhighlight lang="bash"> |
<syntaxhighlight lang="bash"> |
||
⚫ | |||
# Korrekte Schreibweise für einen Vergleich der Zahlen 1 und 5: |
|||
echo "1 und 5 sind gleich" |
|||
then echo "1 und 5 sind gleich" |
|||
else |
else |
||
echo " |
echo "1 und 5 sind nicht gleich" |
||
fi |
fi |
||
# Inkorrekte Schreibweise: |
|||
# Die Test-Funktion "((" wird vom Interpreter nicht erkannt, da das Leerzeichen vor der "1" fehlt. |
|||
⚫ | |||
# Inkorrekte Schreibweise: |
|||
# Der Vergleichsoperator "==" wird vom Interpreter nicht erkannt, da die Leerzeichen vor und nach "==" fehlen. |
|||
if (( 1==5 )); |
|||
</syntaxhighlight> |
</syntaxhighlight> |
||
=== [[Boolesche Variable]] === |
|||
Eine weitere Besonderheit von Shellskript ist, dass die Zahl 0 ''wahr'' (englisch ''true'') entspricht, während Zahlen größer als 0 ''falsch'' (englisch ''false'') entsprechen. In anderen Programmiersprachen wie zum Beispiel [[C (Programmiersprache)|C]], [[Java (Programmiersprache)|Java]] oder [[Python (Programmiersprache)|Python]] und auch in der [[Logik]] ist der [[Wahrheitswert]] genau andersherum definiert. Der Grund liegt darin, dass die Shell oft Rückgabewerte von aufgerufenen Programmen auswerten muss. Eine Rückgabe von 0 entspricht dabei einem fehlerfreien Aufruf des Programms.<ref>[https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/ linuxacademy.com]</ref> |
|||
== Ausführen eines Shellskripts == |
== Ausführen eines Shellskripts == |
||
=== Aufruf in der Unix-Shell === |
=== Aufruf in der Unix-Shell === |
||
Standardmäßig sind neu erstellte Dateien unter Unix nicht ausführbar. Um ein Shellskript ausführen zu können, muss es über die [[Zugriffsrecht]]e auf |
Standardmäßig sind neu erstellte Dateien unter Unix nicht ausführbar. Um ein Shellskript ausführen zu können, muss es über die [[Zugriffsrecht]]e auf „ausführbar“ gesetzt werden. Dies geschieht durch das Programm [[chmod]] mit folgendem (oder ähnlichem) Befehl: |
||
Dies geschieht durch den Befehl [[chmod]]. |
|||
<syntaxhighlight lang="bash"> |
<syntaxhighlight lang="bash"> |
||
chmod +x script.sh |
chmod +x script.sh |
||
Zeile 127: | Zeile 116: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
Falls das Shellskript im aktuellen [[Arbeitsverzeichnis]] (englisch |
Falls das Shellskript im aktuellen [[Arbeitsverzeichnis]] (englisch „working directory“) gespeichert ist und dort ausgeführt werden soll, geschieht dies durch Voranstellen des aktuellen Pfads <code>./</code>: |
||
<syntaxhighlight lang="bash"> |
<syntaxhighlight lang="bash"> |
||
Zeile 136: | Zeile 125: | ||
Das Arbeitsverzeichnis des Shellskripts ist der [[Verzeichnisstruktur|Pfad]], von dem aus es aufgerufen wird, also nicht der Ort, wo es sich selbst befindet. |
Das Arbeitsverzeichnis des Shellskripts ist der [[Verzeichnisstruktur|Pfad]], von dem aus es aufgerufen wird, also nicht der Ort, wo es sich selbst befindet. |
||
== |
== Dateinamenerweiterung == |
||
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 einem [[Texteditor]] oder einer [[Integrierte Entwicklungsumgebung|integrierten Entwicklungsumgebung]]. |
|||
Die Dateiendung eines Shellskripts ist in der Regel <code>.sh</code>. Jedoch muss keine Dateiendung verwendet werden, da diese bei unixoiden Systemen keinerlei technische Bedeutung besitzt und nur dem Benutzer als Erkennungsmerkmal dient. |
|||
Die Erweiterung kann beispielsweise allgemein <samp>.sh</samp> lauten. Spezieller sind Erweiterungen wie <samp>.bash</samp> oder <samp>.zsh</samp>. Texteditoren und ähnlichen dient die Erweiterung zum Anwenden passender [[Syntaxhervorhebung]]. |
|||
== Inhaltstyp == |
|||
Der Inhaltstyp (Content Type oder [[Internet Media Type|MIME-Type]]) kann – abhängig vom System – wie folgt lauten: |
|||
Neben <code>application/x-shellscript</code> findet sich noch der [[Internet Media Type|MIME-Typ]] <code>application/x-sh</code>. Das Unix-Programm <code>[[file]] --mime-type</code> gibt den Typ <code>text/x-shellscript</code> aus. |
|||
* text/x-shellscript |
|||
* text/plain |
|||
* application/x-shellscript |
|||
* application/x-sh<ref>{{Internetquelle |url=https://www.php.net/manual/de/function.finfo-buffer.php |titel=Funktionsreferenz – finfo_buffer |werk=PHP-Handbuch |abruf=2021-03-26}}</ref> |
|||
== Literatur == |
== Literatur == |
Aktuelle Version vom 10. November 2022, 15:08 Uhr
Shell-Skript | |
---|---|
![]() | |
![]()
| |
Dateiendung: | .sh
|
MIME-Type: | text/x-shellscript [1]
|
Erstveröffentlichung: | mit UNIX |
Art: | Skriptsprache |
Enthalten in: | Unix-Shell |
Erweitert von: | div. Unix-Shells, u. a. Bash, Z shell u.v.m. |
Standard(s): | POSIX |
Ein Shellskript oder Shell-Skript ist ein Computerprogramm, das von einer Shell interpretiert und ausgeführt wird. Es ist letztlich eine ausführbare Textdatei, in der all jene Anweisungen verwendet werden können, die ein Benutzer auch in der Befehlszeile 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 Begriff Shellskript wird überwiegend für Unix-Shell-Skripte verwendet und bezieht sich daher vorwiegend auf unixähnliche Systeme, obwohl auch andere Betriebssysteme und Shells ähnliche Skripte nutzen, aber anders bezeichnen.
Ursprung
[Bearbeiten | Quelltext bearbeiten]Shellskripte gehen auf das 1965 geschriebene Programm RUNCOM zurück, das von Louis Pouzin für das Betriebssystem Multics entwickelt wurde. Von ihm stammt auch der Begriff „Shell“, wobei die Weiterentwicklung der Multics-Shell die Fähigkeiten von RUNCOM integrierte.[3]
Die Entwickler von Unix 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. Bei Kommandozeileninterpretern von DOS, technisch gesehen ebenfalls Shells (z. B. COMMAND.COM oder 4DOS), werden Skripte als Stapelverarbeitungsdateien oder „Batch-Dateien“ (von englisch batch jobs für Stapelverarbeitung) bezeichnet. Bei der PowerShell von Microsoft heißen sie „PowerShell-Skripte“.[4]
Syntaxen verschiedener Unix-Shells
[Bearbeiten | Quelltext bearbeiten]Da unterschiedliche Unix-Shells, wie z. B. die Bash oder die C-Shell, nicht die gleiche Syntax 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 in POSIX spezifizierten Syntax. Diese Spezifikation ermöglicht den systemübergreifenden Einsatz eines Skripts und die Interoperabilität mehrerer Systeme. Freilich muss dabei eine POSIX unterstützende Shell eingesetzt werden. Die erste POSIX-Spezifikation fußt auf der Kornshell und berücksichtigt die Eigenheiten der Bourne-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 per Shebang.
#!/bin/sh
(ursprünglich, vor POSIX)- Thompson-Shell, die ursprüngliche UNIX-Shell
- Bourne-Shell, die ab UNIX V7 die Thompson-Shell als Standard-Shell ablöste
#!/bin/sh
(nach Einführung von POSIX)- Almquist-Shell (ash)
- Debian-Almquist-Shell (dash)
- Bourne-Again-Shell, kurz GNU Bash, im POSIX-Modus
- C-Shell (csh)
- TENEX-C-Shell (tcsh), konform zu POSIX.1:2008
- KornShell (ksh) und Public-Domain-Korn-Shell (pdksh), beide konform zu POSIX.2
- Z-Shell (zsh) im POSIX-Modus
#!/bin/bash
(heute wahrscheinlich meist-eingesetzte Shell)- GNU Bash (bash, Bourne-Again-Shell); bewusst nicht POSIX-konform, hat aber einen konformen Modus
- Z-Shell (zsh), versteht auch die Bash-Syntax
Aufbau
[Bearbeiten | Quelltext bearbeiten]In der ersten Zeile eines Shellskripts – auch Header genannt – wird festgelegt, welcher Interpreter das Skript abarbeiten soll. Ein Shellskript beginnt daher mit dem sogenannten Shebang, #!
, 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 in POSIX-Syntax mit einer for
-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 und Romeo. Zu beachten ist, dass die Anführungszeichen nicht Teil des Wertes sind.
Bei jedem Durchlauf wird die Variable i
neu gefüllt und ihr Inhalt dann in die Standardausgabe geschrieben (stdout, siehe Standard-Datenströme). Beim ersten Durchlauf wird die Variable mit Alfa Romeo gefüllt, beim zweiten mit Bentley, beim dritten mit Citroën. Dann endet die Schleife, da es keinen weiteren Wert gibt.
#!/bin/sh
for i in 'Alfa Romeo' 'Bentley' 'Citroën'; do
echo $i
done
Das Auslesen der Variable i
erfolgt, indem ein Dollarzeichen davor geschrieben wird: $i
.
Da das Programm echo 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 wie Alfa 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.
Besonderheiten
[Bearbeiten | Quelltext bearbeiten]Operatoren, Funktionen und Leerzeichen
[Bearbeiten | Quelltext bearbeiten]Eine Besonderheit, im Gegensatz zu anderen Programmiersprachen, ist die zwingende Verwendung von Leerzeichen beim Aufruf von Operatoren und Funktionen.[7]
Vergleichsoperatoren des folgenden Beispiels:
==
, <
, >
, <=
, >=
, !
if (( 1 == 5 )); then
echo "1 und 5 sind gleich"
else
echo "1 und 5 sind nicht gleich"
fi
Ausführen eines Shellskripts
[Bearbeiten | Quelltext bearbeiten]Aufruf in der Unix-Shell
[Bearbeiten | Quelltext bearbeiten]Standardmäßig sind neu erstellte Dateien unter Unix nicht ausführbar. Um ein Shellskript ausführen zu können, muss es über die Zugriffsrechte auf „ausführbar“ gesetzt werden. Dies geschieht durch das Programm chmod mit folgendem (oder ähnlichem) Befehl:
chmod +x script.sh
Soll das Shellskript von einem beliebigen Pfad 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 aktuellen Arbeitsverzeichnis (englisch „working directory“) gespeichert ist und dort ausgeführt werden soll, geschieht dies durch Voranstellen des aktuellen Pfads ./
:
./script.sh
Ausführungsort
[Bearbeiten | Quelltext bearbeiten]Das Arbeitsverzeichnis des Shellskripts ist der Pfad, von dem aus es aufgerufen wird, also nicht der Ort, wo es sich selbst befindet.
Dateinamenerweiterung
[Bearbeiten | Quelltext bearbeiten]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 einem Texteditor oder einer integrierten Entwicklungsumgebung.
Die Erweiterung kann beispielsweise allgemein .sh lauten. Spezieller sind Erweiterungen wie .bash oder .zsh. Texteditoren und ähnlichen dient die Erweiterung zum Anwenden passender Syntaxhervorhebung.
Inhaltstyp
[Bearbeiten | Quelltext bearbeiten]Der Inhaltstyp (Content Type oder MIME-Type) kann – abhängig vom System – wie folgt lauten:
- text/x-shellscript
- text/plain
- application/x-shellscript
- application/x-sh[8]
Literatur
[Bearbeiten | Quelltext bearbeiten]- Brian W. Kernighan: The UNIX Programming Environment. Prentice Hall, 1984, ISBN 0-13-937699-2
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Bourne Shell Scripting. Wikibooks (englisch)
- Bash Shell Scripting. Wikibooks (englisch)
- C Shell Scripting. Wikibooks (englisch)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ a b ShellScript. In: Debian Wiki. Abgerufen am 26. März 2021 (englisch).
- ↑ Brian W. Kernighan: The UNIX Programming Environment. Prentice Hall, 1984, ISBN 0-13-937699-2, Kapitel 3: Using the Shell, S. 94.
- ↑ Chantal Lebrument, Fabien Soyez: The Inventions of Louis Pouzin: One of the Fathers of the Internet. Springer Nature, 2019, ISBN 978-3-03034836-6, S. 24 (englisch, eingeschränkte Vorschau in der Google-Buchsuche): “At the beginning of 1965, he developed the RUNCOM program, an “interpreter” that makes it possible to execute a set of commands contained in a file, and makes parameter substitution possible.”
- ↑ itworld.com
- ↑ Bash POSIX Mode. In: Bash Reference Manual. Abgerufen am 26. März 2021.
- ↑ Bash Shell Scripting. Wikibooks (englisch)
- ↑ opensource.com
- ↑ Funktionsreferenz – finfo_buffer. In: PHP-Handbuch. Abgerufen am 26. März 2021.