Shellscript Programmierung

Die Shell

Unix ist für viele Dinge bekannt. Für seine Leistungsfähigeit. Für seine Modularität. Für seinen monolithischen Kernel. Für viele, viele kryptische Befehle. Und: Für seine Shell.

Googlism

Googlism ist immer für eine Überraschung gut. Die Suche nach shell ergab die ziemlich genaue Definition:

shell is a program that interprets commands and acts as an intermediary between the user and the inner workings of the unix system

Natürlich möchte ich dem geschätzten Leser auch ein paar unterhaltsame Blindgänger nicht vorenthalten:


Es gibt dann noch ein paar weitere Definitionen von Googlism, die die Sache ziemlich gut auf den Punkt bringen:


Shell, was ist das?

Die Shell ist die Textschnittstelle zwischen Unix und Benutzer. Es gibt viele Spielarten. Beispielsweise:


sh: die Bourneshell.

Die Skriptsprache der Bourneshell war ursprünglich ein C, das ziemlich stark mutiert wurde. Für viele, viele Dinge wurden einfach #defines (=C-Makros) geschrieben, beispielsweise wurde IF zu if(, THEN zu ){ und FI zu }.


ksh: die Kornshell.

So praktisch die Bourneshell war, sie hatte einige Unsauberkeiten. Diese wurden durch die Kornshell behoben.


bash: die Bourne AGAIN shell.

Entstand relativ spät und ist die Linux-Standarshell.


csh: die C shell.

Im Prinzip wie die sh, jedoch mit stark an C orientierter Syntax.

Shellscript, was ist das?

Immer wieder die gleichen Befehle einzutippen wird mit der Zeit mühsam. Entsprechend kann man sich ein einfaches Skript schreiben. Jedes Skript fang üblicherweise mit einem Link auf den zu verwendenden Interpreter an, beispielsweise:

#!/bin/bash

oder

#!/bin/rm -f

oder

#!/bin/cat


Wärend erstere Interpreterzeile den Inhalt der Datei an die bash übergibt, löscht zweitere einfach das Programm. Als Interpreter kann man schließlich jedes Unix-Kommando eintragen.

Mit Zeile drei schließlich gibt man das gesamte Programm aus. Sowas, ob sinnvoll oder nicht, geht mit anderen Programmiersprachen bei weitem schwieriger!

Das klassische Hello-World Programm

mit der bash nur zwei Zeilen:


#!/bin/bash
echo hello, world!


Eine Datei zeilenweise einlesen

Geht mit folgendem Snippet:


$ cat readin


#!/bin/bash
cat $1 | while read a; do
echo $a
done


$ readin /etc/passwd

...