Shell Scripte ed

ausführliche Referenz:
http://freeos.com/guides/lsst/

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

'$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

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:
wenn mehrere Befehle nacheinander aus einer Datei lesen sollen, muss man
{
    befehl1
    befehl2
} < datei_name
benutzen, da ansonsten die Datei bei jedem Befehl neu geöffnet wird und somit wieder von vorne gelesen wird!

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:

Bedingungen ed

if-Struktur ed

if trifft eine Entscheidung anhand der Rückgabewertes eines Befehles.

if true
then
    echo hallo
fi

true 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
fi

if-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):

mehrere Fallunterscheidungen ed

case $variablen_name in
    muster1) befehl1 ;;
    muster2) befehl2 ;;
    muster3) befehl3 ;;
esac

Hierbei 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
done

Man 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"
done

for ed

alle Elemente aus einer Liste durchgehen

z.B. Dateien:

for variablen_name in *.txt
do
    echo $variablen_name
done

Arithmetik ed

Numerische Ausdrücke können mit expr ausgewertet werden

expr 4 + 5
expr \( $i + 4 \) * 4
i="expr $i + 1"

Auf manchen Konsolen (?) funktioniert auch

i=$[3+4]
i=$[3 + 4]
i=$((3+4))
i=$((3 + 4))
echo $((3+4))

aber nicht

$((3+4))
$[3+4]

Categories: Computer