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
...Hochkommas...
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 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