Shell Scripte ed
- ausführliche Referenz:
- http://freeos.com/guides/lsst/
Table of Contents
- Shell Scripte
- Grundlagen
- Script Datei
- Kommentare
- Dateinamen-Substitution
- Zeichenketten
- Variablen
- generell
- vordefinierte Variablen
- Ein- und Ausgabe
- direkt
- Ausgabe in Variablen
- Dateien
- Pipe
- Bedingungen
- if-Struktur
- if-Bedingungen
- mehrere Fallunterscheidungen
- einfache Befehls-Verkettung
- Schleifen
- while
- while mit Zählvariable
- for
Grundlagen ed
Script Datei ed
Alle Befehle können direkt in der Shell eingegeben werden, oder in einer Datei, die mit etwas in der Art beginnt:
#! /bin/sh
Die Datei muss ausführbar sein, z.B. durch
chmod a+x datei_name
Kommentare ed
beginnen mit Raute:
# Kommentar...
Dateinamen-Substitution ed
Die Shell ersetzt Dateinamen-Muster automatisch durch die Liste der passenden Dateinamen (mit Leerzeichen getrennt und vor dem Ausführen):
echo *.txt
wenn es eine a.txt und b.txt gibt, wird daraus:
echo a.txt b.txt
und es wird ausgegeben:
a.txt b.txt
Zeichenketten ed
Die Shell trennt Eingaben bei Leerzeichen in einzelne Worte. Um Leerzeichen (und andere von der Shell benutzte Zeichen) in einer Zeichenkette zu verwenden, müssen sie "escaped" werden (durch einen vorangestellten Schrägstrich "\") oder in Hochkommas eingeschlossen:
hallo michi // 2 Wörter: "hallo" und "michi" hallo\ michi // 1 Wort: "hallo michi" "hallo michi" // 1 Wort: "hallo michi" 'hallo michi' // 1 Wort: "hallo michi"
Von der Shell benutzte Zeichen sind dabei
- Leerzeichen
- Hochkommas ", ', "
- Klammern (, )
- \(\lt /tt\gt , \lt tt\gt &\lt /tt\gt , \lt tt\gt |\lt /tt\gt , \lt tt\gt \lt \lt /tt\gt , \lt tt\gt \gt \lt /tt\gt , \lt tt\gt !\lt /tt\gt , \lt tt\gt \\lt /tt\gt , \lt tt\gt ;\lt /tt\gt Die beiden Hochkomma-Arten (\lt tt\gt `...`\lt /tt\gt und \lt tt\gt '...'\lt /tt\gt ) unterscheiden sich darin, ob sie Variablen-Substitution erlauben: a=hallo `\)a" // = "hallo"
'$a' // = "$a"
Variablen ed
generell ed
...sind Strings
Werte in Variablen speichern:
a=hallo a="hallo Welt" a='hallo Welt'
Werte auslesen:
echo $a
dabei substituiert die Shell die Variable durch den Inhalt, beim ausführen wird daraus
echo "hallo"
vordefinierte Variablen ed
- \(0, \)1, \(2...\lt /tt\gt : Parameter beim Aufruf der Scriptdatei (\lt tt\gt \)0 ist dabei der Befehl/die Scriptdatei selbst)
- \(#\lt /tt\gt : Anzahl der Parameter * \lt tt\gt \)*: Menge aller Parameter
- \(\): Prozessnummer des Scriptes
- \(?\lt /tt\gt : Rückgabewert des letzten Befehles * \lt tt\gt \)!: Prozessnummer des letzten Befehles im Hintergrund
Ein- und Ausgabe ed
direkt ed
- Ausgabe
- (auf dem Bildschirm)
echo hallo echo $variablen_name
- Eingabe
- (von der Tastatur)
read variablen_name
Ausgabe in Variablen ed
variablen_name="echo hallo"
speichert die Ausgabe des Befehles echo hallo in einer Variablen
Dateien ed
Die Ein- und Ausgabe von Befehlen kann in Dateien umgeleitet werde
- Ausgabe
Datei mit der Ausgabe überschreiben:
echo hallo > datei_name
an Datei anhängen:
echo hallo >> datei_name
Auch Fehlermeldungen können in Dateien umgeleitet werde:
rm dsfkjsdf 2> datei_name
beides gleichzeitig umleiten
befehl &> datei_name
- Eingabe
Text statt über die übliche Tastatureingabe aus einer Datei ins Programm eingeben:
befehl < datei_name
- Achtung:
{
befehl1
befehl2
} < datei_name- stderr nach stdout umleiten
befehl 2>&1
Pipe ed
Man kann die Ausgabe eines Programmes direkt als Ein gabe eines anderen Programmes benutzen:
cat datei_name | grep ein_muster
Reihenfolge:
- zuerst wird cat ausgeführt und liest den Inhalt der Datei aus
- dann wird grep ausgeführt, und filtert den Inhalt
Bedingungen ed
if-Struktur ed
if trifft eine Entscheidung anhand der Rückgabewertes eines Befehles.
if true
then
echo hallo
fitrue ist ein Befehl, der einfach nur den Rückgabewert 0 ("wahr") produziert. Entsprechend gibt es false.
oder einzeilig:
if true; then echo hallo; fi
oder verzweigt:
if false
then
echo Ja
else
echo Nein
fiif-Bedingungen ed
Zahl-Vergleiche können über eckige Klammern formuliert werden (Leerzeichen sind hier wichtig!):
if [ 4 -lt 5 ] # "if ( 4 < 5 )"
Diese Zeile ist die Abkürzung für den Befehl test:
if test 4 -lt 5
Es gibt mehrere Test-Operationen (siehe man test):
- int -lt int ("<")
- int -le int ("<=")
- int -gt int (">")
- int -ge int (">=")
- int -eq int ("==")
- int -ne int ("!=")
- string = string ("==")
- string != string ("!=")
- -e datei_name ("Datei vorhanden")
mehrere Fallunterscheidungen ed
case $variablen_name in
muster1) befehl1 ;;
muster2) befehl2 ;;
muster3) befehl3 ;;
esacHierbei werden alle Muster durchgegangen und beim ersten passenden der zugehörige Befehl ausgeführt.
Um zu erzwingen, dass auch wirklich ein Befehl ausgeführt wird, sollte am Ende ein default-Muster angegeben werden:
*) default_befehl ;;
einfache Befehls-Verkettung ed
- und:
befehl1 && befehl2 && befehl3
führt nacheinander die Befehle aus, solange die vorherigen Befehle 0 ("wahr) zurückgeben
- oder:
befehl1 || befehl2 || befehl3
führt nacheinander die Befehle aus, bis ein Befehl 0 ("wahr) zurück gibt
- gemischt:
rm datei_name && echo "Datei geloescht" || echo "versagt!"
versucht die Datei zu löschen und je nach Erfolg wird eine Ausgabe gemacht.
Schleifen ed
while ed
Schleifen-Bedingungen werden genau wie die if-Bedingungen formuliert
while Bedingung
do
echo hallo
doneMan kann eine Schleife vorzeitig mit dem Befehl break beenden. Außerdem kann man mit continue wieder zur Schleifenbedingung springen.
while mit Zählvariable ed
i=0
while [ $i -lt 1000 ]
do
echo $i
i="expr $i + 1"
donefor ed
- alle Elemente aus einer Liste durchgehen
z.B. Dateien:
for variablen_name in *.txt
do
echo $variablen_name
done- *.txt wird substituiert durch a.txt b.txt
- Die Schleife wird für jedes Element der Liste ausgeführt und die Variable dabei jeweils auf das Element gesetzt