Linux Shell Skripte: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 93: Zeile 93:
  
 
== Linux Batch Skripte - Beispiele ==
 
== Linux Batch Skripte - Beispiele ==
 
+
=== Skript Dateien in einem Verzeichnis löschen ===
 
<pre>
 
<pre>
 
#!/bin/sh
 
#!/bin/sh

Version vom 11. November 2007, 10:45 Uhr

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

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

Skript Dateien in einem Verzeichnis löschen

#!/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