Linux Shell Skripte
Was ist ein (Shell-) Script?[Bearbeiten]
aus: http://www.linux-fuer-alle.de/doc_show.php?docid=150&catid=8 (Datum des Zugriffs 20.11.2007)
Zielgruppe: Einsteiger
Also hier soll es darum gehen, was ein (Shell-) Script ist. Wir bieten ja einige kleine Scripte auf unserer Website an. Dieses Dokument ist für all diejenigen, die mit einem Script erstmal nicht viel anfangen können und nicht verstehen, was da passiert und wie man damit umgeht. Wir wollen hier allgemein von einem Script sprechen, weil es sich um einen sehr universellen Mechanismus handelt, um den es hier geht.
Mal angenommen, man tippt in seinen Compi ein paar Kommandos in ein xterm ein (Ja, es gibt immer noch Rechner bei denen man auch mit der Tastatur etwas anfangen kann.), um eine bestimmte Aufgabe zu erledigen. Dann stellt man eventuell nach einer Weile fest, dass man diese Aufgabe nicht nur einmal, sondern öfter, vielleicht sogar reglmäßig lösen muss. Ein Beispiel dafür wäre das erstellen einer Sicherheitskopie seiner Daten mit dem Packen eines TAR-Archives, Verschlüsseln und dem Brennen einer CD-Rom. Um sich nun die Tipparbeit zu sparen, schreibt man die Kommandos in eine Textdatei. Sie ist das Script, welches man dann ausführen möchte. Da es verschiedene Programme unter Linux gibt, die Benutzereingaben entgegen nehmen und verarbeiten, muss man am Anfang seines Scriptes festlegen, welches dieser Programme, also welche Shell, verwendet werden soll. Typische Vertreter sind:
/bin/ash /bin/bash /bin/csh /bin/sh
Wenn man nur einfache Programme starten will, ist es erstmal weitgehend egal, welche dieser Shells man verwendet. Bei manchen Distributionen sind einige dieser Shells ein Link auf eine andere Shell, weil man nicht alle Shells beifügen wollte, da sie sich teilweise kaum unterscheiden. Angenommen wir wollen die bash verwenden, um das Programm "df" mit einem Parameter zu starten. Dann schreiben wir folgendes Script:
#!/bin/bash df -h
Der obige Text wird einfach mit einem Editor in eine Textdatei geschrieben, die wir "FreierPlatz.sh" nennen wollen. Die Dateiendung macht leicht erkennbar, dass es sich in diesem Fall um ein Shell-Script handelt. Damit wir es wie ein Programm starten können, müssen wir es als ausführbar markieren:
chmod 755 FreierPlatz.sh
Dabei wird davon ausgegangen, dass wir uns in dem Verzeichnis befinden, in dem das Script liegt. Dann können wir es einfach mit
./FreierPlatz.sh
starten. Man sieht die Ausgabe des Programmes, welches in dem Script gestartet wurde. Nun haben wir in der ersten Zeile des Scriptes das Programm festgelegt, welches diese Datei verarbeiten soll. Dieses Programm interpretiert den Inhalt der Datei und führt entsprechende Aktionen aus. So kann man nicht nur Programme starten, sondern auch richtige Schleifen und Verzweigungen programmieren. Das hängt aber von dem verwendeten Programm ab, was die Befehle ja verstehen muss. Man nennt dieses Programm einen Interpreter (weil er ja die Datei interpretiert). Im obigen Fall haben wir ein Programm verwendet, welches man eben auch zur direkten Eingabe der Befehle als Shell verwendet.
Jetzt ist es auch kein weiter Weg mehr zu komplizierteren Programmiersprachen bzw. Scriptsprachen wie Perl, PHP, Ruby usw... Denn man muss ja nur in der ersten Zeile den gewünschten Interpreter angeben, der die Datei verarbeiten soll. Und davon gibt es einige. Wenn man jetzt auch noch die Dateiendung weglässt, dann kann der Anwender im ersten Moment nicht erkennen, ob es sich um ein Programm handelt, welches mit einem Übersetzer in die Maschinensprache übersetzt wurde, oder um ein Script. Unter Linux gibt es viele solcher Scripte, die die unterschiedlichsten Aufgaben übernehmen. Der grösste Vorteil von ihnen ist, dass Scripte leicht von einem Rechner zu einem anderen transportiert werden können und teilweise auch unter verschiedenen Betriebssystemen laufen.
Ein (Shell-) Script ist also nichts anderes als eine Textdatei, in der Anweisungen für ein Programm, den Interpreter (bzw. die Shell) stehen.
Shell Skripte können wie kleine Programme ausgeführt werden. Sie enthalten eine Reihe von Kommandos die auch mit Schleifen oder Bedingungen angesteuert werden können. Wenn der aktuelle Pfad nicht in der PATH Variablen enthalten ist muß man den Pfad mit angeben. Für das Verzeichnis in dem man sich befindet wäre das z.B.
./meinSkript.sh
Mehr zu Skripten...[Bearbeiten]
Dazu ein kleiner Post aus dem Google Groups Linux Forum:
Ich würde Dir empfehlen, Shellskripte im Allgemeinen lieber nicht mit dem ».«-Kommando zu starten, sondern sie wie eigenständige Programme zu verwenden. Am besten ist es, wenn Du solche Shell-Skripte in ein spezielles Verzeichnis unterhalb des HOME-Verzeichnisses stellst. Das Verzeichnis kannst Du dann in der Umgebungsvariablen »PATH« aufführen. Auf diese Weise werden sie dann, wenn es ans Starten geht, bequem gefunden.
Erzeuge Dir also ein Verzeichnis:
mkdir -p -- ~/myscripts
Sieh nach, ob Du eine Datei mit Namen »~/.bash_profile« hast, wenn nicht, sieh nach, ob Du eine Datei mit Namen »~/.profile« hast. Hast Du keine von beiden, erzeuge eine Datei mit Namen »~/.profile«.
Setze in die Datei eine Zeile mit dem Inhalt
PATH="${PATH:+"$PATH":}""$HOME"/myscripts && export PATH
Ab dem nächsten Neu-Einloggen werden Shell-Skripte dadurch auch im Verzeichnis »~/myscripts« gesucht wie andere Programme auch.
Jetzt zum Shellscript:
Falls Du nicht weißt, wo im Dateisystem das »bash« zu finden ist, sieh nach mit dem Kommando:
$ command -v bash
(Bei mir kommt da als Ergebnis »/bin/bash« heraus.)
Schreibe das als erste Zeile in das Shell-Skript ».myscript.sh«. Setze an den Anfang dieser Zeile die zwei Zeichen »#!«. Bei mir sieht das dann so aus:
#!/bin/bash
Versieh das Shell-Skript mit Ausführungsrechten:
$ chmod +x .myscript.sh
Stecke das Shell-Skript in das Verzeichnis »~/myscripts«:
mv -- .myscript.sh ~/myscripts/.
Jetzt kannst Du es mittels
.my_script.sh
aufrufen.
Wenn Du es so machst, dann tut auch das »exit«-Kommando im Shell-Skript das, was Du wünschst: Das Shell-Skript kommt zu Ende und das Shell, das Deine Kommandos, die Du eintippst, entgegennimmt, ist bereit für neue Kommandos, wie gewünscht:
>Wenn ich ein Shellskript vorzeitig abbrechen möchte, sollte dieses dann >auch an der Abbruchstelle beendet werden, ohne die übrigen Code-Zeilen >auszuführen. Anschließend sollte der Fokus wieder auf der Konsole sein, von >wo das Shellskript gestartet worden war.
Eine Datei mittels des ».«-Kommandos zu starten, ist -- von speziellen Ausnahmen (siehe Jörg Weilbiers Beitrag) abgesehen -- meist keine gute Idee, und zwar aus folgenden Gründen:
Shell-Variablen oder -Funktionen, die man im Shell-Skript anlegt, löscht oder ändert, bleiben entsprechend angelegt, gelöscht bzw. geändert, wenn das mittels ».« abgearbeitete Shell-Skript zu Ende kommt. Traps und andere Einstellungen am Shell, die im Shell-Skript eingestellt werden, bleiben so erhalten, wenn es zu Ende kommt.
Die Folge ist, dass die Umgebung des interaktiven Shells »verschmutzt« wird. Dadurch können überraschende Effekte, mit denen man nicht rechnet, auftreten.
Umgekehrt beeinflussen Einstellungen des interaktiven Shells ebenso das Shell-Skript, mit den entsprechenden Folgen für das Shell-Skript.
-- Wer mir E-Mail schreiben will, stelle | When writing me e-mail, please bitte vor meine E-Mail-Adresse meinen | precede my e-mail address with Vor- und Nachnamen, etwa so: | my full name, like Helmut Waitzmann <x...@example.net>, (Helmut Waitzmann) x...@example.net
Linux Batch Skripte - Beispiele[Bearbeiten]
Skript Dateien in einem Verzeichnis löschen[Bearbeiten]
#!/bin/sh
####################################################################################
# Script loescht alle Dateien in einem Verzeichnis (VERZ) und sämtliche Unter-
# verzeichnisse
# Autor: Uwe Orlemann
# Datum: 2007-10-24
####################################################################################
VERZ="/srv/www/vhosts/audiotec-fischer.de/httpdocs/typo3temp/pics" # Pfad zum Verz. darunter wird ggf. gelöscht
ADMINMAIL="server@webserver-administrator.de" # Mails für den Admin
BETREFF="U7-AF-TMP-Pics-loeschen" # Betreff für die Mail
DATS=`find $VERZ -type f | wc -l`
cd $VERZ;
#pwd
if [ -d != $VERZ ] ; then #existiert das Verz.?
#Prüfen ob Dateien vorhanden
if [ $DATS > 0 ] ; then # sind Dateien vorhanden?
#Dateien loeschen
find $VERZ/ -type f | xargs -i rm -f {}
STATUS="Dateien wurden geloescht!"
else
STATUS="Keine Dateien vorhanden!"
fi
else
#echo "Loesch-Verzeichnis nicht vorhanden!"
STATUS="Loesch-Verzeichnis nicht vorhanden!"
#exit
fi
# Mail an Admin!!!
printf "$STATUS " | mail "$ADMINMAIL" -s $BETREFF
Praktische Linux Schnipsel - Sniplets[Bearbeiten]
Dateien in Unterordneren von latin auf utf-8 umkodieren (recode muß installiert sein)
for i in $(find -type f -name '*.php'); do recode l1..u8 $i; done